链表
程序员文章站
2022-06-09 10:06:14
...
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef int ElemType;
typedef struct Lnode
{
ElemType data;
struct Lnode *next;
}LNode;
LNode *L,*L1,*L2;
LNode *creat_L();
void out_L(LNode *L);
void insert_L(LNode *L,int i, ElemType e);
ElemType delete_L(LNode *L,int i);
int locat_L(LNode *L,ElemType e);
int length(LNode *L);
int alldelete(LNode *L,ElemType e);
int moredelete(LNode *L);
LNode *hebing(LNode *L1,LNode *L2);
void VisitList(LNode *Lc);
void FreeList(LNode *Lc);
int main()
{
int i,k,loc,len;
ElemType e,x;
char ch;
do
{
printf("\n\n\n");
printf("\n\n 1.建立线性链表");
printf("\n\n 2.在i位置插入元素e");
printf("\n\n 3.删除第i个元素,返回其值");
printf("\n\n 4.查找值为e的元素");
printf("\n\n 5.求链表长");
printf("\n\n 6.删除单链表中值为x的所有结点");
printf("\n\n 7.单链表去重");
printf("\n\n 8.两个有序的单链表合并后仍然有序的单链表");
printf("\n——————————");
printf("\n 请输入您的选择(1,2,3,4,5,6,7,8)");
scanf("%d",&k);
switch(k)
{
case 1:
{
L=creat_L();
out_L(L);
}break;
case 2:
{
printf("\n i,e=?");
scanf("%d,%d",&i,&e);
insert_L(L,i,e);
out_L(L);
}break;
case 3:
{
printf("\n i=?");
scanf("%d",&i);
x=delete_L(L,i);
out_L(L);
if(x!=-1)
printf("\n x=%d\n",x);
}break;
case 4:
{
printf("\n e=?");
scanf("%d",&e);
loc=locat_L(L,e);
if(loc==-1)
printf("\n 未找到 %d",loc);
else
printf("\n 已找到,元素位置是 %d",loc);
}break;
case 5:
{
len=length(L);
printf("%d",len);
}break;
case 6:
{
scanf("%d",&e);
x=alldelete(L,e);
out_L(L);
}break;
case 7:
{
moredelete(L);
out_L(L);
}
case 8:
{
L1=creat_L();
L2=creat_L();
hebing(L1,L2);
out_L(L1);
}break;
}
printf("\n-------------");
}while(k>=1&&k<9);
printf("\n 再见!");
printf("\n 按enter键,返回");
ch=getchar();
}
//建立线性链表(尾部插入结点建立单链表)
LNode *creat_L()
{
LNode *h,*p,*s;
ElemType x;
h=(LNode *)malloc(sizeof(LNode));
h->next=NULL;
p=h;
printf("\n data=?");
scanf("%d",&x);
while(x!=-111)
{
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
s->next=NULL;
p->next=s;
p=s;
printf("data=?(-111end)");
scanf("%d",&x);
}
return(h);
}
void out_L(LNode *L)
{
LNode *p;
char ch;
p=L->next;
printf("\n\n");
while(p!=NULL)
{
printf("%5d",p->data);
p=p->next;
};
printf("\n\n按enter键,继续");
ch=getchar();
}
void insert_L(LNode *L,int i, ElemType e)
{
LNode *s,*p,*q;
int j;
p=L;
j=0;
while((p!=NULL)&&(j<i-1))
{
p=p->next;
j++;
}
if(p==NULL||j>i-1)
printf("\n i ERROR");
else
{
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
}
}
ElemType delete_L(LNode *L,int i)
{
LNode *p,*q;
int j;
ElemType x;
p=L;
j=0;
while(p->next!=NULL&&j<i-1)
{
p=p->next;
j++;
}
if(p->next==NULL)
{
printf("\n i ERROR");
return(-1);
}
else
{
q=p->next;
x=q->data;
p->next=q->next;
free(q);
return(x);
}
}
int locat_L(LNode *L,ElemType e)
{
LNode *p;
int j=1;
p=L->next;
while(p!=NULL&&p->data!=e)
{
p=p->next;
j++;
}
if(p!=NULL) return(j);
else return(-1);
}
int length(LNode *L)
{
LNode *p;
int countt=0;
p=L->next;
while(p!=NULL)
{
countt++;
p=p->next;
}
return(countt);
}
int alldelete(LNode *L,ElemType e)
{
LNode *p,*q;
p=L;
q=L->next;
while(q!=NULL)
{
if(q->data==e)
{
p->next=q->next;
free(q);
q=p->next;
}
else
{
p=q;
q=q->next;
}
}
}
int moredelete(LNode *L)
{
LNode *p,*q,*str;
p=L->next;
while(p!=NULL)
{
q=p,str=p->next;
while (str!=NULL)
{
if (str->data==p->data)
{
q->next=str->next;
free(str);
str=q->next;
}
else
{
q=str;
str=str->next;
}
}
p=p->next ;
}
}
LNode *hebing(LNode *L1,LNode *L2)
{
LNode *Lt,*pa,*pb,*pc,*ptr;
Lt=L1;
pc=L1;
pa=L1->next;
pb=L2->next;
while(pa!=NULL&& pb!=NULL)
{
if(pa->data<pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else if(pa->data>pb->data)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else if(pa->data==pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
ptr=pb;
pb=pb->next;
free(ptr);
}
}
if(pa!=NULL)
pc->next=pa;
else
pc->next=pb ;
// free(L2) ;
}
/*void VisitList(LNode *L)
{
if(L)
{
VisitList(L->next);
}
else
{
printf("null");
}
}*/
/*void FreeList(LNode *L)
{
if(L==NULL)
{
return ;
}
else
{
LNode *temp=L->next;
delete L;
Lc=temp;
FreeList(L);
}
}
*/
上一篇: 第十二节--类的自动加载
下一篇: 关于jQuery常用选择器详解