2020-12-13# **链表的增删改查,逆置**

链表的增删改查,逆置,长度,排序,是否为空

1.``准备阶段## ##

# include<stdio.h>
# include<stdlib.h>

typedef struct Node
{
	int data;
	struct Node* pNext;
}NODE,*PNODE;

PNODE creat_list(void); 
void traverse_list(PNODE);
void insert_list(PNODE,int);
void delet_list(PNODE,int);
void change_list(PNODE,int);
void chear_list(PNODE);
void free_list(PNODE);
void inversion_list(PNODE);
void head_insert(PNODE);
void tail_insert(PNODE);
int length_list(PNODE);
void sort_list(PNODE);
bool is_empty(PNODE);

int main(void)
{
	PNODE  pHead = creat_list();
	traverse_list(pHead);
	is_empty(pHead);
//	insert_list(pHead,3);
//	traverse_list(pHead);
//	delet_list(pHead,1);
//	change_list(pHead,4);	
//	chear_list(pHead);
	free_list(pHead);
	is_empty(pHead);
//	insert_list(pHead,0);
//	insert_list(pHead,0);
//	head_insert(pHead);
//	inversion_list(pHead);
//	tail_insert(pHead);
//	length_list(pHead);
 //	sort_list(pHead);
	traverse_list(pHead);
	return 0;
}

2.创建函数

PNODE creat_list(void)
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(!pHead)
	{
		puts("内存分配失败,程序退出!");
		exit(-1); 
	}
	
	PNODE pTail = pHead;
	pTail->pNext = NULL;
	
	int len, val, i;
	puts("链表长度为:");
	scanf("%d",&len);
	
	for(i=0;i<len;++i)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);		 
	}
		printf("第%d个链节的数据为:",i+1);
		scanf("%d",&val);
		
		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}
	
	return pHead;
}

3.增----头插,尾插,任意位置插入:

头插代码:

void head_insert(PNODE pHead)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);
	}
	pHead->pNext = pNew;
	puts("请输入你要头插的数:");
	scanf("%d",&pNew->data );
	pNew->pNext = NULL; 
}

尾插代码:

void tail_insert(PNODE pHead)
{
	PNODE p = pHead->pNext;
	while(p->pNext)
	{
		p = p->pNext ;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);
	}
	puts("请输入想尾插的数为:");
	scanf("%d",&pNew->data  ) ;
	p->pNext = pNew;
	pNew->pNext = NULL;
}
}

任意位置插入:

void insert_list(PNODE pHead,int pos)
{
	PNODE p = pHead->pNext ;
	int i;
	while(i<pos-1&&p)
	{
		++i;
		p = p->pNext ;
	}
	
	if(p)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(!pNew)
		{
			puts("内存分配失败,程序退出!");
			exit(-1); 
		}
		printf("在第%d个数后插入:",pos);
		scanf("%d",&pNew->data );
		pNew->pNext = p->pNext ;
		p->pNext = pNew;
	}
	else
	{
		puts("没有该位置!"); 
	}
}

2.删除函数----任意节点删除,链表清空

任意节点删除:

void delet_list(PNODE pHead,int pos)
{
	PNODE p = pHead->pNext ,q;
	int i = 0;
	while(i<pos-1&&p)
	{
		++i;		
	 	q = p;
		p = p->pNext ;	
	}
	if(p)
	{
		q->pNext = p->pNext ;
		free(p);
	}
	else
	puts("没有该节点!"); 	
}

链表清空:

void free_list(PNODE pHead)
{
	PNODE p = pHead->pNext ;
	PNODE q ;
	while(p)
	{
		q = p->pNext ;
		free(p);
		p = q;
	}
	pHead->pNext = NULL;
	printf("链表已清空!");
}

注:链表清空后,想要继续插入必须使用头插!

3.任意节点改动:

void change_list(PNODE pHead,int pos)
{
	PNODE p = (PNODE)malloc(sizeof(NODE));
	p =pHead->pNext;
	int i = 0;
	while(i<pos-1&&p)
	{
		++i;
		p = p->pNext ;
	}
	if(p){
	printf("将第%d个链节的值改为:",pos);
	scanf("%d",&p->data  );
	}
	else
	puts("没有该节点!");
}

4.任意数据查找:

void chear_list(PNODE pHead)
{
	int val,i=1,judge = 1;
	puts("想查几:");
	scanf("%d",&val);
	
	PNODE p = pHead->pNext ;
	
	while(p)
	{		
		if(val == p->data )
		{
			printf("%d在第%d个链节中!",val,i);
			judge = 0;
		}
		i++;
		p = p->pNext;
	} 
	if(judge)
	puts("没有该值!"); 
}

5.链表的逆置:

void inversion_list(PNODE pHead)
{
	PNODE p = pHead->pNext,q ;
	pHead->pNext = NULL;
	while(p)
	{
		q = p;
		p = p->pNext ;
		q->pNext = pHead->pNext ;
		pHead->pNext = q;		
	}
	puts("链表已逆置!");
}

6,判读链表长度

int length_list(PNODE pHead)
{
	int len = 0;
	PNODE p = pHead->pNext ;
	while(p)
	{
		p = p->pNext ;
		++len;
	}
	printf("链表长度为%d\n",len);
	return len;
}

7,链表数据排序

void sort_list(PNODE pHead)
{
	int t,i,j,len = length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->pNext ;i<len-1;++i,p=p->pNext )
	{
		for(j=i+1,q=p->pNext ;j<len;++j,q=q->pNext )
		{
			if(p->data >q->data )
			{
				t = p->data ;
				p->data = q->data ;
				q->data = t;
			}
		}
	}
	
}

8,判断链表是否为空:

bool is_empty(PNODE pHead)
{
	if(pHead->pNext == NULL)
	{
		puts("链表为空!");
		return true; 
	}
	else
	{
		puts("链表不为空!");
		return false; 
	}
}

9,完整代码

# include<stdio.h>
# include<stdlib.h>

typedef struct  Node
{
	int data;
	struct Node * pNext;
}NODE,*PNODE;

PNODE creat_list(void); 
void traverse_list(PNODE);
void insert_list(PNODE,int);
void delet_list(PNODE,int);
void change_list(PNODE,int);
void chear_list(PNODE);
void free_list(PNODE);
void inversion_list(PNODE);
void head_insert(PNODE);
void tail_insert(PNODE);
int length_list(PNODE);
void sort_list(PNODE);
bool is_empty(PNODE);

int main(void)
{
	PNODE  pHead = creat_list();
	traverse_list(pHead);
	is_empty(pHead);
//	insert_list(pHead,3);
//	traverse_list(pHead);
//	delet_list(pHead,1);
//	change_list(pHead,4);	
//	chear_list(pHead);
//	free_list(pHead);
//	is_empty(pHead);
//	insert_list(pHead,0);
//	insert_list(pHead,0);
//	head_insert(pHead);
//	inversion_list(pHead);
//	tail_insert(pHead);
//	length_list(pHead);
 //	sort_list(pHead);
//	traverse_list(pHead);
	return 0;
}

PNODE creat_list(void)
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(!pHead)
	{
		puts("内存分配失败,程序退出!");
		exit(-1); 
	}
	
	PNODE pTail = pHead;
	pTail->pNext = NULL;
	
	
	
	int len, val, i;
	puts("链表长度为:");
	scanf("%d",&len);
	
	for(i=0;i<len;++i)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);		 
	}
		printf("第%d个链节的数据为:",i+1);
		scanf("%d",&val);
		
		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}
	
	return pHead;
}

void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext ;
	while(p)
	{
		printf(" %d " ,p->data );
		p = p->pNext ;
	}
	puts("遍历结束!"); 
}

void insert_list(PNODE pHead,int pos)
{
	PNODE p = pHead->pNext ;
	int i;
	while(i<pos-1&&p)
	{
		++i;
		p = p->pNext ;
	}
	
	if(p)
	{
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(!pNew)
		{
			puts("内存分配失败,程序退出!");
			exit(-1); 
		}
		printf("在第%d个数后插入:",pos);
		scanf("%d",&pNew->data );
		pNew->pNext = p->pNext ;
		p->pNext = pNew;
	}
	else
	{
		puts("没有该位置!"); 
	}
}

void delet_list(PNODE pHead,int pos)
{
	PNODE p = pHead->pNext ,q;
	int i = 0;
	while(i<pos-1&&p)
	{
		++i;		
	 	q = p;
		p = p->pNext ;	
	}
	if(p)
	{
		q->pNext = p->pNext ;
		free(p);
	}
	else
	puts("没有该节点!"); 	
}

void change_list(PNODE pHead,int pos)
{
	PNODE p = (PNODE)malloc(sizeof(NODE));
	p =pHead->pNext;
	int i = 0;
	while(i<pos-1&&p)
	{
		++i;
		p = p->pNext ;
	}
	if(p){
	printf("将第%d个链节的值改为:",pos);
	scanf("%d",&p->data  );
	}
	else
	puts("没有该节点!");
}

void chear_list(PNODE pHead)
{
	int val,i=1,judge = 1;
	puts("想查几:");
	scanf("%d",&val);
	
	PNODE p = pHead->pNext ;
	
	while(p)
	{		
		if(val == p->data )
		{
			printf("%d在第%d个链节中!",val,i);
			judge = 0;
		}
		i++;
		p = p->pNext;
	} 
	if(judge)
	puts("没有该值!"); 
}

void free_list(PNODE pHead)
{
	PNODE p = pHead->pNext ;
	PNODE q ;
	while(p)
	{
		q = p->pNext ;
		free(p);
		p = q;
	}
	pHead->pNext = NULL;
	printf("链表已清空!");
}

void inversion_list(PNODE pHead)
{
	PNODE p = pHead->pNext,q ;
	pHead->pNext = NULL;
	while(p)
	{
		q = p;
		p = p->pNext ;
		q->pNext = pHead->pNext ;
		pHead->pNext = q;		
	}
	puts("链表已逆置!");
}

void head_insert(PNODE pHead)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);
	}
	pHead->pNext = pNew;
	puts("请输入你要头插的数:");
	scanf("%d",&pNew->data );
	pNew->pNext = NULL; 
}

void tail_insert(PNODE pHead)
{
	PNODE p = pHead->pNext;
	while(p->pNext)
	{
		p = p->pNext ;
	}
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(!pNew)
	{
		puts("内存分配失败,程序退出!");
		exit(-1);
	}
	puts("请输入想尾插的数为:");
	scanf("%d",&pNew->data  ) ;
	p->pNext = pNew;
	pNew->pNext = NULL;
}

int length_list(PNODE pHead)
{
	int len = 0;
	PNODE p = pHead->pNext ;
	while(p)
	{
		p = p->pNext ;
		++len;
	}
	printf("链表长度为%d\n",len);
	return len;
}

void sort_list(PNODE pHead)
{
	int t,i,j,len = length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->pNext ;i<len-1;++i,p=p->pNext )
	{
		for(j=i+1,q=p->pNext ;j<len;++j,q=q->pNext )
		{
			if(p->data >q->data )
			{
				t = p->data ;
				p->data = q->data ;
				q->data = t;
			}
		}
	}
	
}

bool is_empty(PNODE pHead)
{
	if(pHead->pNext == NULL)
	{
		puts("链表为空!");
		return true; 
	}
	else
	{
		puts("链表不为空!");
		return false; 
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值