您的位置:首页 > 理论基础 > 数据结构算法

数据结构_在一个链表中删除一段插入另一链表

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: