数据结构之——单链表

本文介绍了单链表的概念,作为一种链式存储的数据结构,单链表由节点组成,每个节点包含数据和指针。文章详细讲解了链表的存储方法,即链接存储,并提供了C语言实现链表初始化、打印、添加、插入和删除元素的代码示例。此外,作者强调了学习单链表在理解和掌握数据结构及算法中的重要性。
摘要由CSDN通过智能技术生成

一、单链表概念

单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

二、储存方法

链接存储方法
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。

三、代码实现

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
 
typedef struct LinkNode {
	char data;
	struct LinkNode* next;
}LNode,*LinkList;
 
//判空
void judgeList(LinkList paraNode)
{
	if (paraNode == NULL)
	{
		printf("fail to apply memory\r\n");
		exit(0);
	}
}
 
//链表初始化
LinkList InitLinkList()
{
	LinkList tempHeader = (LinkList)malloc(sizeof(LNode));
	//Step1:check the memory
	judgeList(tempHeader);
	//Step2:Initalize
	tempHeader->data = '\0';
	tempHeader->next = NULL;
	return tempHeader;
}//off InitLinkList
 
//打印链表的元素
void printList(LinkList paraHeader)
{
	LinkList p = paraHeader->next;
	while (p != NULL)
	{
		printf("%c", p->data);
		p = p->next;
	}//off while
	printf("\r\n");
}
 
//添加链表元素
void appendElement(LinkList paraHeader, char paraChar)
{
	LinkList p, q;
	//Step1:Construct a new node
	q = (LinkList)malloc(sizeof(LNode));
	//Step2:check the menory
	judgeList(q);
	q->data = paraChar;
	q->next = NULL;
	//Step3:Search the tail
	p = paraHeader;
	while (p->next != NULL)
	{
		p = p->next;
	}
	//Step4:Now add link
	p->next = q;
}//off AppendElement
 
//插入元素
void insertElement(LinkList paraHeader, char paraChar, int paraPosition)
{
	LinkList p, q;
	p = paraHeader;
	//Step1:Check position
	for (int i = 0; i < paraPosition; i++)
	{
		p = p->next;
		if (p == NULL)
		{
			printf("The position %d is beyond the list.", paraPosition);
			return;
		}//off if
	}//off for
	//Step2:Construct a new node
	q = (LinkList)malloc(sizeof(LNode));
    judgeList(q);
	q->data = paraChar;
	printf("linking\r\n");
	q->next = p->next;
	p->next = q;
}//off InsertElement
 
//删除元素
void deleElement(LinkList paraHeader, char paraChar)
{
	LinkList p, q;
	p = paraHeader;
	while (p->next != NULL && p->next->data != paraChar)
	{
		p = p->next;
	}//off while
	if (p->next == NULL)
	{
		printf("Cannot delete %c\r\n", paraChar);
		return;
	}//off if
	q = p->next;
	p->next = p->next->next;
	free(q);
}//off DeleElement
 
//释放空间
void freeList(LinkList paraHeader)
{
	LinkList p = paraHeader;
	LinkList q;
	while (p != NULL)
	{
		q = p;
		p = p->next;
		free(q);
	}
}
 
//测试功能
void AppendInsertDeleTest()
{
	//Step1:Initialize an emtpy list
	LinkList tempList = InitLinkList();
	printList(tempList);
	//Step2:Add some characters
	appendElement(tempList, 'H');
	appendElement(tempList, 'e');
	appendElement(tempList, 'l');
	appendElement(tempList, 'l');
	appendElement(tempList, 'o');
	appendElement(tempList, '!');
	printList(tempList);
	//Step3:Delete some characters
	deleElement(tempList, 'e');
	deleElement(tempList, 'a');
	deleElement(tempList, 'o');
	printList(tempList);
	//Step4:Insert some characters
	insertElement(tempList, 'o', 1);
	printList(tempList);
	//Step:free the memory
	freeList(tempList);
}//off AppendDeleInsert
int main()
{
	AppendInsertDeleTest();
	return 0;
}

四、心得体会

  学习单链表需要理解数据结构的基本概念和基础操作,熟练掌握指针指向和节点操作的内存分配、异常处理,同时也需要注意单链表和其他数据结构之间的区别。在深入学习数据结构和算法的过程中,学习单链表是极为重要的一部分,它有助于我们更加高效和准确地处理计算机程序中的数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值