归并线性表[原创]

  1 #include  < stdio.h >
  2 #include  < malloc.h >
  3 #define  NULL 0
  4
  5 ExpandedBlockStart.gifContractedBlock.giftypedef  struct  lnode {
  6    char data;
  7    struct lnode *next;
  8}
* link, * position;
  9
 10
 11 ExpandedBlockStart.gifContractedBlock.giftypedef  struct {
 12    link head,tail;
 13    int len;
 14}
linklist;
 15
 16 ExpandedBlockStart.gifContractedBlock.gif /**/ /*=================================*/
 17 ExpandedBlockStart.gifContractedBlock.gif void  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
 32 ExpandedBlockStart.gifContractedBlock.gif int  compare( char  a, char  b) {  /**//*---compare---比较两个元素的大小关系*/
 33    return a-b;
 34}

 35
 36
 37 ExpandedBlockStart.gifContractedBlock.gif int  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
 49 ExpandedBlockStart.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
 62 ExpandedBlockStart.gifContractedBlock.gif char  getcurelem(link p) {        /**//*---返回p所指结点中元素的值-*/
 63    return p->data;
 64}

 65
 66
 67 ExpandedBlockStart.gifContractedBlock.gif int  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
 76 ExpandedBlockStart.gifContractedBlock.gif int  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
 92 ExpandedBlockStart.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
105 ExpandedBlockStart.gifContractedBlock.gif int  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
143 ExpandedBlockStart.gifContractedBlock.gif /**/ /*============主函数部分=========*/
144
145 ExpandedBlockStart.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值