#include<stdio.h>
#include<stdlib.h>
typedef int datatype;
//存储结构定义
typedef struct LNODE
{
datatype data;
struct LNODE *next;
}Lnode, *LinkList;
//打印链表
void printlist(const LinkList l)
{
LinkList p=l->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf(" \n");
return;
}
//链表初始化
LinkList initlist()
{
LinkList l;
l=(LinkList)malloc(sizeof(Lnode));
if(l==NULL)
{
printf("l failed! \n");
return NULL;
}
l->next=NULL;
return l;
}
//创建链表
LinkList createlist(LinkList l)
{
l=initlist();
int x;
LinkList s,r=l;
printf("please input the data: \n");
scanf("%d",&x);
while(x!=0)
{
s=(LinkList)malloc(sizeof(Lnode));
s->data=x;
if(l->next==NULL)
l->next=s;
else
r->next=s;
r=s;
scanf("%d",&x);
}
r->next=NULL;
return l;
}
//求链表的长度
int lengthlinklist(const LinkList l)
{
int i=0;
LinkList p=l;
while(p->next)
{
++i;
p=p->next;
}
return i;
}
//查找第i个元素
LinkList searchlinklist(const LinkList l,int i)
{
int j=0;
LinkList p=l;
if(lengthlinklist(l)<i)
{
printf("i is error! \n");
return NULL;
}
while(p->next&&j<i)
{
++j;
p=p->next;
}
if(j==i)
return p;
else
return NULL;
}
//查找值为x的元素
LinkList searchlinklist1(LinkList l, datatype x)
{
LinkList p=l->next;
while(p&&p->data!=x)
p=p->next;
if(p->data==x)
return p;
else
return NULL;
}
//在链表的第i个位置插入值为x的节点
int insertlinklist(LinkList l,int i, datatype x)
{
LinkList p,s=searchlinklist(l,i-1);
if(!p)
{
printf("error! \n");
return 0;
}
else
{
p=(LinkList)malloc(sizeof(Lnode));
p->data=x;
p->next=s->next;
s->next=p;
return 1;
}
}
//删除第i个元素
int deletelinklist(LinkList l, int i)
{
LinkList p;
LinkList q=searchlinklist(l,i-1);
if(!p)
{
printf("error! \n");
return -1;
}
else if(!p->next)
{
printf("i not exist! \n");
return 0;
}
else
{
p=q->next;
q->next=p->next;
free(p);
return 1;
}
}
//合并两个链表
LinkList guibinglinklist(const LinkList a,const LinkList b,LinkList c)
{
LinkList h1,h2,h;
h1=a->next;
h2=b->next;
c=a;
h=c;
while(h1&&h2)
{
if(h1->data<=h2->data)
{
h->next=h1;
h=h1;
h1=h1->next;
}
else
{
h->next=h2;
h=h2;
h2=h2->next;
}
}
if(h1)
h->next=h1;
if(h2)
h->next=h2;
printlist(h);
return c;
}
//链表转置
LinkList zhuanzhilinklist(LinkList l)
{
LinkList p,q,r;
p=l->next;
q=NULL;
while(p)
{
r=p->next;
p->next=q;
q=p;
p=r;
}
l->next=q;
return l;
}
//排序
LinkList sortlist(LinkList l)
{
if(!l->next||!l->next->next)
return;
LinkList p,h,t;
p=l->next->next;
l->next->next=NULL;
while(p)
{
h=p->next;
t=l;
while(t->next&&p->data>t->next->data)
t=t->next;
p->next=t->next;
t->next=p;
p=h;
}
return l;
}
//删除链表中重复的元素
LinkList shanchongfu(LinkList l)
{
LinkList p,q,r;
p=l->next;
if(!p) return NULL;
while(p)
{
q=p;
while(q->next)
{
if(q->next->data==p->data)
{
r=q->next;
q->next=r->next;
free(r);
}
else
q=q->next;
}
p=p->next;
}
return l;
}
int main()
{
LinkList a,b,c;
// LinkList p; //打印
LinkList s;
int len;
a=createlist(a);
printlist(a);
len=lengthlinklist(a);
printf("length =%d \n",len);
s=searchlinklist(a,3);
printf("the third is:%d \n",s->data);
if(searchlinklist(a,4))
printf("exit! \n");
else
printf("not exit! \n");
if(insertlinklist(a,3,8)==1)
{
printf("insert success! \n");
}
else
printf("insert failed! \n");
if(deletelinklist(a,4)==1)
{
printf("delete success! \n");
}
b=createlist(b);
printlist(b);
c=guibinglinklist(a,b,c);
if(c)
printf("guibing chenggong! \n");
printlist(c);
c=zhuanzhilinklist(c);
printlist(c);
c=sortlist(c);
printlist(c);
c=shanchongfu(c);
printlist(c);
return 0;
}
链表的基本操作
最新推荐文章于 2024-07-19 22:37:45 发布