单链表的增、删、改、查、排序--小结

头文件:

#include <stdlib>

结构体:

typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode;

内存申请:

LNode *s=(LNode*)malloc(sizeof(LNode));

链表清空:

 //清空链表
void ClearList(LNode* L)
{
	Node* p;
	while(L->next){
	p=L->next;
	L->next=p->next;
	free(p);
}

完整代码(重点学习尾插法、头插法):

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode;
createHead(LNode *L)
 {
 
 	int a;
 	LNode *h;
 	h=L;
 	L->next=NULL;
 	printf("input list data:\n");
 	scanf("%d",&a);
 	while(a!=-1)
 	{
 		LNode *s=(LNode*)malloc(sizeof(LNode));
 		s->data=a;
 		s->next=h->next;
 		h->next=s;
 		scanf("%d",&a);
	 }
 	
 	
 }
//CreateList
 create(LNode *L)
 {
 
 	int a;
 	LNode *h;
 	h=L;
 	L->next=NULL;
 	printf("input list data:\n");
 	scanf("%d",&a);
 	while(a!=-1)
 	{
 		LNode *s=(LNode*)malloc(sizeof(LNode));
 		s->data=a;
 		h->next=s;
 		h=s;
 		scanf("%d",&a);
	 }
 	h->next=NULL;
 	
 }
 //Output List
 OutputList(LNode *L)
 {
 		printf("OutputList data:\n");
 	while(L->next)
 	{
 		printf("%d\t",L->next->data);
 		L->next=L->next->next;
	 }
	 printf("\n");
  } 
  MergeList(LNode *L1,LNode *L2)
  {
  	LNode *pa,*pb,*pc;
  	pc=L1;
//  	  	L1->next=pa;//L1指向Pa(所以这种写法错误) 
//  	L2->next=pb;
  	pa=L1->next;//pa指向L1的下一个结点 
  	pb=L2->next;
  	while(pa&&pb)
  	{
  		if(pa->data>=pb->data)
  		{
  			pc->next=pb;
  			pc=pb;
  			pb=pb->next;
		  }
		  else
		  {
		  	pc->next=pa;
		  	pc=pa;
		  	pa=pa->next;
		  }
	  }
	   pc->next=pa?pa:pb;//插入剩余结点
//	  if(pa==NULL)
//	  	pc->next=pb;
//	  else
//	 	pc->next=pa;
  }
  //删除元素
Delete(LNode *L1,int a)
{
	LNode *pa,*pb;
	pa=L1->next;
	pb=L1;
	while(pa)
	{
		if(pa->data!=a)
		{
			pa=pa->next;
			pb=pb->next;
		}
		else
		{
			pb->next=pa->next;
			pa=pa->next; 
			
		}
	}
}

 //插入有序链表中
Insert(LNode *L1,LNode *t,int a)
{
	//用前驱和后继去解决 
	LNode *p,*pre;
	pre=L1;
	p=L1->next;
	t->data=a;
	t->next=NULL;
	while(p)
	{
		if(p->data>=a)
		{
			t->next=pre->next;
			pre->next=t;
			break;
		}
		pre=p;
		p=p->next;
	}
	
	
			
		

}
//排序
Sort(LNode *L)
{
	//利用前驱和后继 
	LNode *p,*q;
	int t;
	for(p=L->next;p!=NULL;p=p->next)
	for(q=p->next;q!=NULL;q=q->next)
	{
		if(p->data>q->data)
		{
			t=p->data;
			p->data=q->data;
			q->data=t;
		}
	}	
} 

InverseList(LNode *L)
{
LNode *p,*q;
 p=L->next;
 L->next=NULL;
	while(p) 
	{
		//先保存后继结点 
		q=p;//q和p指向同一结点 
		p=p->next;//p后移一位 

		q->next=L->next;//较难理解,第一个节点(也是最后一个结点,因为是倒插进去的,跟进栈一个道理,先进的在最下面)应指向空
		L->next=q;//头节点指向第一个结点 

	}
}
main()
{
	
	LNode *L1,*L2,*L3 ;
		L1 =(LNode*)malloc(sizeof(LNode));
//		L2 =(LNode*)malloc(sizeof(LNode));

	createHead(L1);//头插法 
//	create(L2);//尾插法
//合并单链表 ,合并后仍然有序 
//	MergeList(L1,L2);



插入有序链表中
//LNode *t;
//t=(LNode*)malloc(sizeof(LNode));
//Insert(L1,t,3);
 
//删除指定元素
//Delete(L1,3); 
 
//排序 
Sort(L1);

//逆置单链表 
InverseList(L1);

//输出
OutputList(L1);	
}

注意:

        1、C语言写程序,不能把申请内存代码写入函数中,否则将无法保存链表,本文把申请空间写道主函数里 )。

       2、 理解p->next=s和s=p->next。(第一个p指向s,第二个是把p指向的赋值给s)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值