单链表的创建和各种功能。

本文探讨了如何创建单链表,并详细介绍了其增删改查等基本操作,是理解数据结构中链表概念的好资源。

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

后续修改,现在放着以便平时看。

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

typedef struct node       //构建每个节点的数据类型和指针域,用typedef减少之后的代码量
{
	int data;//数据域中的数据是int类型
	struct node* pnext;
	//指针域存储下一个节点的地址,使用struct node*的具体原因我自己也没太弄明白,
	//有兴趣的朋友可以去看郝斌数据结构课思考。
}NODE,*PNODE;    //NODE==struct node    PNODE==struct node*


//函数声明
PNODE creat_list(void);
void list_traversal(PNODE phead);
bool is_empty(PNODE phead);
int length_list(PNODE phead);
bool insert_list(PNODE phead,int val,int position);
bool delete_list(PNODE phead,int position,int* researve);
void sort_list(PNODE phead,int len);


//主函数
int main()
{
	PNODE phead=NULL;
	int len,position,val;
	int* researve=NULL;
	phead = creat_list();  //创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
	len=length_list(phead);
	if(is_empty(phead))
	{
		printf("链表为空!\n");
	}
	else
	{
		list_traversal(phead);//遍历该单链表中的所有数据
		printf("排序后:\n");
		sort_list(phead, len);//对链表中的数据大小进行排序
		list_traversal(phead);
		printf("请输入你想插入数据所放置的链表节点的位置:");
		scanf("%d",&position);
		printf("请输入你想插入的数据:");
		scanf("%d",&val);
		printf("%d  %d\n",position,val);
		insert_list(phead,val,position);
		list_traversal(phead);
        delete_list(phead,4,researve);
		list_traversal(phead);
	}

	return 0;
}





//函数具体代码

//创建一个非循环单链表,并将该链表的头结点的地址赋给pHead
PNODE creat_list(void)
{
	int len,i,val;//len表示长度,val代表输入节点的数据
	printf("请输入您需要生成的链表节点的个数:len = ");
	scanf("%d",&len);//链表长度
	
	PNODE phead = (PNODE)malloc(sizeof(NODE));  //生成头节点
	//reserve_last始终指向链表的最后一个节点,避免后面添加新节点在链表的最后面时所有新节点都挂在了头节点后面
	PNODE reserve_last = phead;  
	reserve_last->pnext=NULL;
	
	for(i=0;i<len;i++)
	{
	//判断是否分配内存成功
		if(phead==NULL)
		{
			printf("分配失败");
			exit(-1);
		}
		printf("请输入第%d个节点的数据:",i+1);
		scanf("%d",&val);
		//创建要挂在链表结尾的新节点
		PNODE pnew = (PNODE)malloc(sizeof(NODE));
		//判断是否分配内存成功
		if(pnew==NULL)
		{
			printf("分配失败");
			exit(-1);
		}
		//使得新节点数据域等于val
		pnew->data=val;
		//使得pnew节点挂在链表的最后一个节点
		reserve_last->pnext = pnew;
		//令最后一个节点的指针域变为NULL,不指向其他地方了
		pnew->pnext=NULL;
		//这一步尤其重要,保证了reserve_last始终指向链表最后一个节点
		reserve_last = pnew;
	}
	return phead;
}



//遍历单链表中的所有数据
void list_traversal(PNODE phead)
{
	PNODE p=phead->pnext;
	while(p!=NULL)
	{
	//phead是头指针,即phead->pnext为头结点,假设头结点是a,所以phead->pnext->data==a->data
	//那么就得到了头结点中的数据。
		printf("%d",p->data);
		p=p->pnext;//使得phead指针指向下一个节点,以便循环得到下一个节点的数据
		printf("\n");
	};
	printf("遍历结束\n");
	return;
}


//判断链表是否为空
bool is_empty(PNODE phead)
{
	if(phead->pnext==NULL)
		return true;
	else
		return false;
}



int length_list(PNODE phead)
{
	int len=0;
	PNODE p=phead->pnext;
	//PNODE p=(PNODE)malloc(sizeof(NODE));
	//p->pnext=phead->pnext;
	while(p!=NULL)
	{
		len++;
		p=p->pnext;
	}
	printf("链表长度是%d\n",len);
	return len;
}



bool insert_list(PNODE phead,int val,int position)
{
	int i=0;
	PNODE p=phead;
	PNODE q=NULL;
	PNODE pnew=(PNODE)malloc(sizeof(NODE));
	while(p!=NULL&&i<position-1)
	{
		p=p->pnext;
		i++;
	};
	if(p==NULL||i>position-1)
	{
		return false;
	}
	else if(p!=NULL&&i==position-1)
	{
		pnew->data=val;
		q=p->pnext;
		p->pnext=pnew;
		pnew->pnext=q;
	}
	return true;
}



bool delete_list(PNODE phead,int position,int* researve)
{
	printf("first");
	PNODE p=phead;
	PNODE q=NULL;
	int i=0;
	while(p!=NULL&&i<position-1)
	{
		p=p->pnext;
		i++;
		printf("second");
	};
	if(p==NULL||i>position-1)
	{
		return false;
	}
	else if(p!=NULL&&i==position-1)
	{
		q=p->pnext;
		*researve=q->data;
		free(q);
		p->pnext=p->pnext->pnext;
		q=NULL;
	}
	return true;
}



void sort_list(PNODE phead,int len)
{
	int i,j,t;
	PNODE p=phead;
	PNODE q=(PNODE)malloc(sizeof(NODE));
	for(i=0;i<len-1;i++)
	{
		p=p->pnext;
		q=p;//为什么q=p->next不行?
		for(j=i;j<len;j++)
		{
			if(p->data > q->data)
			{
				t=p->data;
				p->data=q->data;
				q->data=t;
			}
			q=q->pnext;
		}
	}
	return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值