一、单链表概念
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、储存方法
链接存储方法
链接方式存储的线性表简称为链表(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;
}
四、心得体会
学习单链表需要理解数据结构的基本概念和基础操作,熟练掌握指针指向和节点操作的内存分配、异常处理,同时也需要注意单链表和其他数据结构之间的区别。在深入学习数据结构和算法的过程中,学习单链表是极为重要的一部分,它有助于我们更加高效和准确地处理计算机程序中的数据。