C语言数据结构单链表的相关操作

//链表的相关操作 
#include <stdio.h>
#include <stdlib.h>
typedef int element;
typedef struct list
{
    element data;
	struct list *next;
}LINK_LIST;
LINK_LIST*creat_linklist();//建立链表(头插法和尾插法)
void inser_beforelinklist(LINK_LIST*head,LINK_LIST*q,LINK_LIST*s);
//前插法进行插入数据
void inser_afterlinklist(LINK_LIST*p,LINK_LIST*s);//后插法进行插入数据
int insert_nodelinklist(LINK_LIST*head,LINK_LIST*s,int i);//在指定位置插入数据
void print_linklist(LINK_LIST*head);//链表的遍历 
LINK_LIST*search_linklist(LINK_LIST*head,element x);//按值进行查找
LINK_LIST*Getdata_linklist(LINK_LIST*head,int i);//按序号进行查找
int delet_linklist(LINK_LIST*p);//删除其后继节点
int Delet_linklist(LINK_LIST*head,LINK_LIST*p);//删除指定节点
int deletnode_linklist(LINK_LIST*head,int i);//按指定位置进行删除
LINK_LIST*CREAT_null(LINK_LIST*head);//置空表
void main()
{
	LINK_LIST*head;
	head=creat_linklist();
	if(head!=NULL)
	printf("链表创建成功!\n");
	else
	printf("链表创建失败!\n");
	
}
LINK_LIST*creat_linklist()//链表的创建 
{   //头插法进行链表的创建 
	/*LINK_LIST*head;
	LINK_LIST*p; 
	element x;
	head=(LINK_LIST*)malloc(sizeof(LINK_LIST));
	if(head==NULL)
	  return NULL;
	  else
	  head->next=NULL;
	  printf("请输入数据:\n");
	  scanf("%d",&x);
	  while(x!=0)
	  {
	  	p=(LINK_LIST*)malloc(sizeof(LINK_LIST));
		  if(p==NULL)
		     return p;
		     else
		     {
		     	 p->data=x;
			    p->next=head->next;
			     head->next=p;
			    // printf("请继续输入数据 键入0结束输入:\n");
			       scanf("%d",&x); 
		     	
		     	
			 }
		} */
		
		
		//尾插法进行链表的创建
		LINK_LIST*head;
		 LINK_LIST*p;
		LINK_LIST*tail;
		  element x;
		head=(LINK_LIST*)malloc(sizeof(LINK_LIST));
		if(head==NULL)
		  return head;
		  else
		   tail=head;
		   printf("请输入数据:\n");
		    scanf("%d",&x);
		    while(x!=0)
		    {
		    	p=(LINK_LIST*)malloc(sizeof(LINK_LIST));
		    	if(p==NULL)
		    	  printf("链表创建失败!\n");
		    	  else
		    	  tail->next=p;
		    	  tail=p;
		    	  tail->next=NULL;
		    	  scanf("%d",&x);
		   	}
		   
		return head;

}	 
void inser_afterlinklist(LINK_LIST*p,LINK_LIST*s)//将s放在p的后面 后插法 
{
	s->next=p->next;
	p->next=s;
} 
void inser_beforelinklist(LINK_LIST*head,LINK_LIST*q,LINK_LIST*s)//将s插入到q的前面 
{
     LINK_LIST*p;
	 p=head;
	 while(p->next!=q)
	    {
	    	
	    	p=p->next;
	    }
		s->next=q;
		p->next=s;	
} 
LINK_LIST*search_linklist(LINK_LIST*head,element x)//按值进行查找返回该值所在节点 
{
	LINK_LIST*p;
	 p=head->next;
	 if(p==NULL)
	 return NULL;
	 while(p->data!=x)
	 {
	 	p=p->next;
	 }
	 return p;
}
LINK_LIST*Getdata_linklist(LINK_LIST*head,int i)//按序号进行查找
{
	int j=0;
	LINK_LIST*p;
	p=head; 
	if(i<=0)
	return NULL;
	else
	{
		while(p!=NULL&&i>j)
		{
			p=p->next;
			j++;
		}
		if(j==i)
		  return p;
		  else
		  return NULL;
		
		
		
		
	}
} 
int insert_nodelinklist(LINK_LIST*head,LINK_LIST*s,int i)//在指定位置插入数据
{
	LINK_LIST*p;
	if(i<=0)//头结点的序号为0 
	return 0;
	else if(i==1)
	   p==head;
	   else
	   p= Getdata_linklist(head,i-1);
	  inser_afterlinklist(p,s);
	    return 1; 
} 
int delet_linklist(LINK_LIST*p)//删除其后继节点
{
	LINK_LIST *s;
	 s=p->next;
	 if(s==NULL)//判断p是否有后继节点 
	 return 0;
	 p=s->next;
	 free(s);
	 return 1; 
}
void print_linklist(LINK_LIST*head)//链表的遍历
{
	LINK_LIST*p;
	p=head->next;
	if(p==NULL)
	  return 0;
	  else
	  {printf("遍历后的数据为:\n");
	      printf("head->");
	      while(p!=NULL)
	      {
	      	printf("%d",p->data);
	      	p=p->next;
		  }
		  printf("->end");
	  	
	  }
	  
} 
int Delet_linklist(LINK_LIST*head,LINK_LIST*p)//删除指定节点
{
	LINK_LIST*q;
	 
	if(p->next!=NULL)
	 {
	     q=p->next;
	     p->data=p->next->data;
	     p->next=q->next;
	     free(q);
	   }
	   else
	   {
	   q=head;
	     while(q->next!=q)
	     {
	     	q=q->next;
	     	
		 }
		 delet_linklist(q);//删除其后继节点
		 
	   	
	   	
	   }
}
LINK_LIST*CREAT_null(LINK_LIST*head)//置空表
{
	LINK_LIST*p;
	p=head->next;
	if(p==NULL)
	return NULL;
	while(p!=NULL)
	{
		
		 delet_linklist(p);
		 p=p->next;
}
}
LINK_LIST*reverse_linklist(LINK_LIST*head)//链表的倒置
{
	LINK_LIST*p;
	LINK_LIST*q;
	p=head->next;//指向下一个节点 //可以继续进行链表的遍历 
	head->next=NULL;//将原链表置空 
	if(p==NULL)
	  return NULL;
	  else
	   {
	   	while(p!=NULL)
	   	 {
	   	 	q=p;
	   	 	q->next=head->next;
	   	 	 head->next=q;
	   	 	  p=p->next;
	   	 }
	   	 return head;
	   	
	   	
	   	
	   }
} 
LINK_LIST*insertsort_linklist(LINK_LIST*head,LINK_LIST*s)
{
	LINK_LIST*p;
	p=head;
	if(p==NULL)
	  return NULL;
	  else
	  {
	  	while((p->next!=NULL)&&(p->next->data<s->data))//可以获知前一个节点 进行插入 
	  	
	  	  	p=p->next;
	  	  
	  	  s->next=p;
	  	  p->next=s;
	   }
	   return head;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值