链表(单链表)的多种功能实现

这篇博客深入介绍了链表的基本操作,包括如何创建链表、头插法和尾插法插入元素、遍历链表、判断链表是否为空、删除指定元素、在特定位置插入元素以及使用冒泡排序对链表进行排序。示例代码详细展示了这些操作的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 希望这篇博客可以让你深入理解链表。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct Node{
	int data;
	struct Node * next;
}Node;//链表创建 

void creat(Node *head,int size);//创建 
void forwardInsert(Node *head,int data);//头插 
void backInsert(Node *head,int data);//尾插 
void travel(Node *head);//遍历 
int isEmpty(Node *head);//判空 
void AllDelete(Node *head);//删除 
void SomeDataDelete(Node *head,int data);//删除一个数 
void SomeDataInsert(Node *head,int data,int num);//在某位置插入一个数 

int Search(Node *head,int data);//查找 
void sort(Node *head,int (*cmp)(int,int));//冒泡排序 
int Ascend(int x,int y);//升序 
int Descend(int x,int y);//降序 

int main()
{
	Node *head=(Node*)malloc(sizeof(Node));//头节点 
	head->next=NULL;
	
	int num,temp,i;
	
	printf("Linknum:");//创建 
	scanf("%d",&num);
	creat(head,num);
	travel(head);
	
	printf("Insert forwarddata:");//头插 
	scanf("%d",&temp);
	forwardInsert(head,temp);
	travel(head);
	
	printf("Insert backdata:");//尾插 
	scanf("%d",&temp);
	backInsert(head,temp);
	travel(head);
	
	printf("Somedata delete:");//删除 
	scanf("%d",&temp);
	SomeDataDelete(head,temp);
	travel(head);
	
	printf("SomeDataInsert:input data and which:"); //某一位置插入某个数(BUG不可尾插) 
	scanf("%d %d",&temp,&i); 
	SomeDataInsert(head,temp,i);
	travel(head);
	
	sort(head,Descend);
	travel(head);
	
	printf("Alldelete:\n"); //删除 
	AllDelete(head);
	travel(head);
	isEmpty(head);
	free(head);//free掉头节点 
	
	return 0;
}
int Descend(int x,int y)
{
	if(x<y)
	{
		return 0;
	}else
	{
		return 1;
	}
}
int Ascend(int x,int y)
{
	if(x<y)
	{
		return 1;
	}else
	{
		return 0;
	}
}
void sort(Node *head,int(*cmp)(int,int))
{
	if(head->next==NULL)
	{
		printf("Empty Node!\n");
		return;
	}
	if(head->next->next==NULL)
	{
		printf("Only one element!\n");
	}
 	Node *p1;
 	Node *p2;
 	int temp;//交换 
 	for (p1=head->next; p1->next!=NULL;p1=p1->next) 
 	{
 		 for (p2=p1->next; p2!=NULL; p2=p2->next)
 		 {
  			if ((*cmp)(p1->data,p2->data))
  			{
				temp=p1->data;
				p1->data=p2->data;
				p2->data=temp;
   			}
  		}
 }
}
void creat(Node *head,int size)
{
	int i;
	Node *p=head;
	for(i=1;i<=size;i++)
	{
		Node *newnode =(Node*)malloc(sizeof(Node));
		newnode->next=NULL;
		printf("--%d--:请输入数据:",i); 
		scanf("%d",&newnode->data);
		p->next= newnode;
		p=newnode;
	}
	return;
}
void forwardInsert(Node *head,int data)
{
	Node *newhead=(Node*)malloc(sizeof(Node));
	newhead->data=data;
	newhead->next= head->next;
	head->next= newhead;
	return;
}
void travel(Node *head)
{
	Node *p=head;
	int i=0;
	while(p->next!=NULL)
	{	
		i++;
		p=p->next; 
		printf("List%d:  data: %d\n",i,p->data);
	}
	if(i==0)
	{
		printf("Empty!\n");
	}
	return;
}
void backInsert(Node *head,int data)
{
	Node *p=head;
	Node *back=(Node*)malloc(sizeof(Node));
	back->next=NULL;
	back->data=data;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	p->next=back;
	return;
}
int isEmpty(Node *head)
{
	if(head->next==NULL)
	{
		printf("is Empty!\n");
		return 1;
	}else
	{
		printf("No Empty!\n");
		return 0;
	}
}
void AllDelete(Node *head)
{
	Node *p=head->next;
	Node *temp=head;
	while(p!=NULL)
	{
		temp=p;
		p=p->next;
		free(temp);
	}
	head->next=NULL;
	return;
}
void SomeDataDelete(Node *head,int data)
{
	Node *p=head;
	Node *last=head;
	int flag=1;
	while(p->next!=NULL)
	{
		p=p->next;
		if(p->data==data)
		{
			flag=0;
			if(p->next!=NULL)
			{
				last->next=p->next;
				last=p->next;
			}else
			{
				last->next=NULL;
			}
		}else
		{
			last=last->next;
		}
	}
	if(flag)
	{
		printf("No this data!\n");
	}
	return;
}
void SomeDataInsert(Node *head,int data,int num)
{
	Node *p=head;
	Node *last=head;
	int i=0;
	while(p->next!=NULL)
	{ 
		p=p->next;
		i++;
		if(i==num)
		{
			Node *NewNode=(Node*)malloc(sizeof(Node));
			NewNode->data=data;
			last->next= NewNode;
			NewNode->next=p;
		}
		last=last->next;
	}
}

 核心是head头节点的利用,还有其他功能想要的实现的话可以试试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值