归并线性表[原创]

链表合并算法
  1#include <stdio.h>
  2#include <malloc.h>
  3#define NULL 0
  4
  5ExpandedBlockStart.gifContractedBlock.giftypedef struct lnode{
  6    char data;
  7    struct lnode *next;
  8}
*link,*position;
  9
 10
 11ExpandedBlockStart.gifContractedBlock.giftypedef struct{
 12    link head,tail;
 13    int len;
 14}
linklist;
 15
 16ExpandedBlockStart.gifContractedBlock.gif/**//*=================================*/
 17ExpandedBlockStart.gifContractedBlock.gifvoid print(linklist l){     /**//*---print---在屏幕上输出链表的所有元素*/
 18    link p=NULL;
 19    p=l.head;
 20ExpandedSubBlockStart.gifContractedSubBlock.gif    if(!p->next){
 21        printf("\nThe linklist is empty.\n\n");
 22        return ;
 23    }

 24    printf("The list:");
 25ExpandedSubBlockStart.gifContractedSubBlock.gif    while(p){
 26        printf("%c-",p->data);
 27        p=p->next;
 28    }

 29}

 30
 31
 32ExpandedBlockStart.gifContractedBlock.gifint compare(char a,char b){  /**//*---compare---比较两个元素的大小关系*/
 33    return a-b;
 34}

 35
 36
 37ExpandedBlockStart.gifContractedBlock.gifint length(link s)/**//*---length---求链的长度*/
 38ExpandedSubBlockStart.gifContractedSubBlock.gif    int i=0;/**//*i不赋初值,编译错误“可能在i定义以前使用了它在length函数中”*/
 39    link p=NULL;
 40    p=s;
 41ExpandedSubBlockStart.gifContractedSubBlock.gif    while(p->next!=NULL){
 42        p=p->next;
 43        i++;
 44    }

 45    return i;
 46}

 47
 48
 49ExpandedBlockStart.gifContractedBlock.gifposition makenode(char e){       /**//*---分配由p指向的结点并赋值为e---*/
 50    link p=NULL;
 51    p=(link)malloc(sizeof(struct lnode));
 52ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*---struct lnode 才能表示一个结构体类型并可用于分配空间的元素类型定义-*/
 53ExpandedSubBlockStart.gifContractedSubBlock.gif    if(p){
 54        p->data=e;
 55        p->next=NULL;
 56    }

 57    else return;
 58    return p;
 59}

 60
 61
 62ExpandedBlockStart.gifContractedBlock.gifchar getcurelem(link p){        /**//*---返回p所指结点中元素的值-*/
 63    return p->data;
 64}

 65
 66
 67ExpandedBlockStart.gifContractedBlock.gifint initlist(linklist *l){      /**//*---构造一个由l指向的空的线性表-*/
 68    l->head=makenode('L');
 69ExpandedSubBlockStart.gifContractedSubBlock.gif    l->head->next=NULL;/**//*不是l->head=NULL*/
 70    l->tail=l->head;
 71    l->len=0;
 72    return 1;
 73}

 74
 75
 76ExpandedBlockStart.gifContractedBlock.gifint append(linklist *l,link s){  /**//*---将指针s所的一串结点链接在线性表L的最后一个结点-*/
 77    link q;
 78    q=l->head;
 79ExpandedSubBlockStart.gifContractedSubBlock.gif    if(!l->tail){/**//*考虑到链表为空的情况*/
 80        l->head->next=s;
 81ExpandedSubBlockStart.gifContractedSubBlock.gif        while(q->next) q=q->next;/**//*尾结点的处理*/
 82        l->tail=q;
 83    }

 84    l->tail->next=q=s;
 85ExpandedSubBlockStart.gifContractedSubBlock.gif    while(q->next) q=q->next;/**//*不能忘了对尾结点的处理*/
 86    l->tail=q;
 87    l->len+=length(s);
 88
 89}

 90
 91
 92ExpandedBlockStart.gifContractedBlock.gifposition delfirst(linklist *l,link q){    /**//*---删除表中第一个结点并以q返回-*/
 93ExpandedSubBlockStart.gifContractedSubBlock.gif    if(!l->head->next){
 94        printf("\nThe linklist is empty,can not delete..\n");
 95        return 0;
 96    }

 97    q=l->head->next;
 98    l->head->next=l->head->next->next;
 99    return q;
100}

101
102
103
104
105ExpandedBlockStart.gifContractedBlock.gifint mergelist_l(linklist *la,linklist *lb,linklist *lc){    /**//* 算法2.19*/
106    char a,b;
107    link q=NULL;
108
109    position pa=NULL,pb=NULL;
110
111    pa=la->head->next;
112    pb=lb->head->next;
113
114    if(!initlist(lc))    return 0;
115    printf("oopop"); print(*la);
116ExpandedSubBlockStart.gifContractedSubBlock.gif    while(pa&&pb){
117        a=getcurelem(pa);   b=getcurelem(pb);
118
119ExpandedSubBlockStart.gifContractedSubBlock.gif        if(compare(a,b)<=0){
120
121            q=delfirst(la,q);
122            append(lc,q);
123            pa=la->head->next;
124
125        }

126ExpandedSubBlockStart.gifContractedSubBlock.gif        else{
127            q=delfirst(lb,q);
128            append(lc,q);
129            pb=lb->head->next;
130
131        }

132    }

133
134
135    if(pa) append(lc,pa);
136    else    append(lc,pb);
137
138    return 1;
139}

140
141
142
143ExpandedBlockStart.gifContractedBlock.gif/**//*============主函数部分=========*/
144
145ExpandedBlockStart.gifContractedBlock.gifmain(){
146
147    int i=0;
148    char temp;
149    link s,n;
150    linklist *l,*la=NULL,*lb,*lc=NULL;
151    initlist(la);initlist(lb);initlist(lc);
152
153
154
155    temp='A';
156    la->head=s=makenode('X');
157ExpandedSubBlockStart.gifContractedSubBlock.gif    for(i=1;i<=10;i++,temp+=2){
158         s->next=makenode(temp);
159         s=s->next;
160ExpandedSubBlockStart.gifContractedSubBlock.gif    }
/**//*构造以(*la).head为头结点的链表*/
161        printf("\nla=");   print(*la);
162
163
164    temp='B';
165    lb->head=n=makenode('X');
166ExpandedSubBlockStart.gifContractedSubBlock.gif    for(i=1;i<=10;i++,temp+=2){
167         n->next=makenode(temp);
168         n=n->next;
169ExpandedSubBlockStart.gifContractedSubBlock.gif    }
/**//*构造以(*lb).head为头结点的链表*/
170        printf("\nlb=");   print(*lb);
171
172    mergelist_l(la,lb,lc);
173ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//*归并la、lb指向的线性链表为lc*/
174        printf("\nThe mergelisted link lc,");   print(*lc);
175
176
177
178getch();
179}

180
181

转载于:https://www.cnblogs.com/LinderMan/archive/2009/07/25/1530766.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值