数据结构--单链表的基本操作

本文介绍了一种使用C语言实现链表的方法,并详细展示了如何创建链表、遍历链表、插入数据、删除数据以及计算链表长度等功能。通过具体的代码实例,读者可以更好地理解链表的工作原理。

链表定义:n 个节点离散分配,彼此之间通过指针相连, 每个节点只有一个前驱节点和一个后驱节点, 首节点没有前驱节点, 尾节点没有后驱节点。

链表的基本操作:

包括: 求长度, 插入数据, 删除数据, 遍历等

下面是代码演示:

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

typedef struct stu
{
	int date;
	struct stu * pNext;
}NODE, * PNODE;

PNODE create_list();					// 创建一个链表
void traveral_list(PNODE pHead);			// 遍历整个链表
int insert_list(PNODE pHead);				// 插入数据
int delete_list(PNODE pHead, int *val);			// 删除数据
void length_list(PNODE pHead);				// 计算链表长度

int main(void)
{
	PNODE pHead;					// pHead 用来保存头结点
	int val;					// val 用来保存删除的元素
	
	pHead = create_list();
	traveral_list(pHead);
	length_list(pHead);
	
	if (insert_list(pHead))
		printf("插入数据成功\n");
	traveral_list(pHead);
	
	if (delete_list(pHead, &val))
		printf("删除节点成功\n");
	traveral_list(pHead);
	
	return 0;
}
PNODE create_list()
{
	PNODE pHead = (PNODE)malloc(sizeof(NODE));		// pHead 指向头节点。
	int len, i, val;					// len 用来表示链表的长度。

	printf("请输入您需要的链表长度:len = ");
	scanf("%d", &len);

	PNODE pTail = pHead;		// 建立一个临时指针
	pTail->pNext = NULL;
	
	for (i = 0; i < len; i++)
	{
		printf("请输入你要给第%d个链表的数值:", i+1);
		scanf("%d", &val);

		PNODE pNew = (PNODE)malloc(sizeof(NODE));			// pNew 指向新建的节点。
		pNew->date = val;						// 给新建立的节点赋值。
		pTail->pNext = pNew;					// 使得前一个节点的指针域指向后一个节点。
		pTail = pNew;					// pTail 也指向新建立的节点。
		pTail->pNext = NULL;					// 使得新建立的节点的指针域为NULL
	}
	printf("链表建立成功\n\n");
	return pHead;
}
void traveral_list(PNODE pHead)
{
	PNODE p = pHead->pNext;						// p 指向首节点
	printf("开始遍历整个链表\n");
	while (NULL != p)
	{
		printf("%d ", p->date);
		p = p->pNext;
	}
	printf("\n遍历完成\n\n");
	return;
}
int insert_list(PNODE pHead)
{
	int pos, val;
	int i = 0;
	PNODE p = pHead;			// p 指向头结点。
	printf("请输入您要在第n个节点前面增加的数据(中间以空格隔开):\n");
	scanf("%d %d", &pos, &val);
	while (NULL != p && i < pos - 1)
	{
		p = p->pNext;
		i++;
	}
	if (i > pos - 1 || p == NULL)
		return 0;
	
	
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	PNODE q = p->pNext;		// q 也指向pos个指针。
	p->pNext = pNew;
	pNew->pNext = q;
	pNew->date = val;

	return 1;
}
int delete_list(PNODE pHead, int *pVal)
{
	int i = 0, pos;	
	PNODE p = pHead;

	printf("请输入您想删除的节点数:pos = ");
	scanf("%d", &pos);
	while (NULL != p && i < pos - 1)
	{
		p = p->pNext;
		i++;
	}
	if (i > pos - 1 || p == NULL)
		return 0;
	
	PNODE q = p->pNext;						// 建立一个临时指针
	*pVal = q->date;
	p->pNext = p->pNext->pNext;
	free(q);							// 把删除的节点free掉
	q = NULL;
	printf("您删除的元素是: %d\n", *pVal);				// 输出删除的元素
	return 1;
}
void length_list(PNODE pHead)
{
	int i = 0;
	PNODE p = pHead->pNext;

	while (NULL != p)
	{
		p = p->pNext;
		i++;
	}
	printf("链表的长度为%d\n\n", i);
	
	return;
}

运行结果如下图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值