链表的基本操作

#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(" 
");
	return;
}

//链表初始化
LinkList initlist()
{
	LinkList l;
	l=(LinkList)malloc(sizeof(Lnode));
	if(l==NULL)
	{
		printf("l failed! 
");
		return NULL;
	}
	l->next=NULL;

	return l;
}

//创建链表
LinkList createlist(LinkList l)
{
	l=initlist();
        
	int x;
	LinkList s,r=l;
	printf("please input the data: 
");
        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! 
");
		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! 
");
		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! 
");
		return -1;
	}
	else if(!p->next)
	{
		printf("i not exist! 
");
		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 
",len);

	s=searchlinklist(a,3);
	printf("the third is:%d  
",s->data);

	if(searchlinklist(a,4))
		printf("exit! 
");
	else 
		printf("not exit! 
");

	if(insertlinklist(a,3,8)==1)
	{
		printf("insert success! 
");
	}
	else
		printf("insert failed! 
");
	if(deletelinklist(a,4)==1)
	{
		printf("delete success! 
");
	}


	b=createlist(b);
	printlist(b);

	c=guibinglinklist(a,b,c);
	if(c)
		printf("guibing chenggong! 
");
	printlist(c);

	c=zhuanzhilinklist(c);
	printlist(c);

	c=sortlist(c);
	printlist(c);

	c=shanchongfu(c);
	printlist(c);
	return 0;
}

原文地址:https://www.cnblogs.com/bzyzhang/p/5399631.html