链表
来源:互联网 发布:f35知乎 编辑:程序博客网 时间:2024/05/01 13:21
# include "stdio.h"
# include "stdlib.h"
typedef struct LNode
{
int data;
struct LNode *next;
}LNode ,*LinkList;
int getelem_L(LinkList L,int i,int &e)
{
LinkList p;
int j=0;
p=L->next;
++j;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i) return 0;
e=p->data;
return 1;
}
int listinsert_L(LinkList &L,int i,int e)
{
LinkList p,s;
int j;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;
++ j;
}
if(!p||j>i-1) return 0;
s=(LinkList)malloc(sizeof(LNode));
s->data =e;
s->next=p->next;
p->next=s;
return 1;
}
int listdelete_L(LinkList &L,int i,int &e)
{
LinkList p,q;
p=L->next;
int j=1;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1) return 0;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return 1;
}
void output(LinkList L)
{
LinkList p;
p=L->next;
printf("链表中的元素为:/n");
while(p)
{
printf("%5d",p->data);
p=p->next;
}
printf("/n");
}
void creatlist_L(LinkList &L,int n)
{
LinkList p;
int i;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
printf("请依次反向输入链表中的元素:/n");
for(i=n;i>0;--i)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void mergelist_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
LinkList 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);
}
void main()
{
LinkList La,Lb,Lc;
int m,e;
//构造链表La
printf("请输入链表中元素的个数:/n");
scanf("%d",&m);
creatlist_L(La,m); //调用上面的create函数输入链表元素
output(La); //调用上面的output函数输出链表元素
//构造链表Lb
printf("请输入链表中元素的个数:/n");
scanf("%d",&m);
creatlist_L(Lb,m);
output(Lb);
//在链表La中插入新元素
printf("请输入要插入元素的位置和值:/n");
scanf("%d%d",&m,&e);
listinsert_L(La,m,e);
output(La);
//在链表La中删除一个元素
printf("请输入要删除元素的位置:/n");
scanf("%d",&m);
listdelete_L(La,m,e);
output(La);
//合并La和Lb到Lc
mergelist_L(La,Lb,Lc);
output(Lc);
}