数据结构_在一个链表中删除一段插入另一链表
2015-10-21 13:57
337 查看
#include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; } Node, *Linklist; Linklist newlist()//构建一个链表 { Node *L, *r, *p; ElemType x; L = (Linklist)malloc(sizeof(Node)); L->next = NULL; // r=L; while (scanf("%d", &x) != EOF) { p = (Linklist)malloc(sizeof(Node)); p->data = x; //逆序构建链表 p->next = L->next;//逆序构建链表 L->next = p;//逆序构建链表 // p->data=x; // r->next=p; // r=r->next; } // r->next=NULL; return L; } Linklist Operationlist(Linklist La, Linklist Lb, int i, int m, int j)//操作链表 { Node *pa, *qa, *pb, *qb; int cnt; pa = La->next; pb = Lb->next; cnt = 1; //寻找删除的开始位置 while (pa != NULL && cnt < i - 1) { pa = pa->next; ++cnt; } if (pa == NULL || cnt > i - 1) { printf("LA delete wrong place\n"); return Lb; } qa = pa->next;// cnt = 1; //寻找删除的结束位置 while (qa != NULL && cnt < m) { qa = qa->next; ++cnt; } if (qa == NULL || cnt > m) { printf("LA delete too many datas\n"); return Lb; } cnt = 1; //寻找插入的位置 while (pb != NULL && cnt < j - 1) { pb = pb->next; ++cnt; } if (qa == NULL || cnt > j - 1) { printf("LB insert wrong place\n"); return Lb; } qb = pa->next; pa->next = qa->next;//新的链表la qa->next = pb->next;//新的链表lb pb->next = qb; return Lb; } Linklist Mergelist_L(Linklist &La,Linklist &Lb,Linklist &Lc)//归并 { Node *pa,*pb,*pc; pa=La->next; pb=Lb->next; Lc=pc=La; while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; free(Lb); return Lc; } int main() { Node *la, *lb, *p,*a,*b,*c; int i, m, j; printf("input LA data: \n"); la = newlist(); printf("input LB data: \n"); lb = newlist(); printf("input LA delete place : \n"); scanf("%d", &i); printf("input LA delete num : \n"); scanf("%d", &m); printf("input LB insert place : \n"); scanf("%d", &j); Operationlist(la, lb, i, m, j); printf("LA:\n"); for (p = la->next; p != NULL; p = p->next) printf("%d ",p->data); printf("\n"); printf("LB:\n"); for (p = lb->next; p != NULL; p = p->next) printf("%d ",p->data); printf("\n"); free(la); //释放链表 free(lb); //释放链表 //归并函数调用 a=newlist(); b=newlist(); Mergelist_L(a,b,c); for (p = c->next; p != NULL; p = p->next) printf("%d ",p->data); printf("\n"); return 0; }