• 链表的基本操作


    #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;
    }

  • 相关阅读:
    总结一些css加载动画
    写日历的一些总结(三)
    写日历的一些总结(二)
    写日历的一些总结
    兼容性问题总结(转)
    关于npm(转)
    关于NaN
    面向对象与原型
    git命令
    python django 数据库树形菜单的设计
  • 原文地址:https://www.cnblogs.com/bzyzhang/p/5399631.html
Copyright © 2020-2023  润新知