经过第二节课的学习,我学到了一个新的对于数据进行存储以及使用的方式-----单链表。它让我重新认识到了C语言中的数据结构,以后我对于C语言数据的使用,不再是以单一的数组、线性表来使用,而是可以用到单链表去对数据进行增加、插入、删除等一系列操作。同时,经过描摹老师的代码,我也感触深刻,对单链表这部分的内容理解的更加深入,有助于我后续在实际应用中更好的操作和管理数据,也开阔了我的知识面。话不多说,以下是描摹老师的代码,以及我对与单链表进行实体化的示意图。
基础函数
定义结构体
typedef struct LinkNode
{
char data;
struct LinkNode *next;
}LNode,*LinkList,*NodePtr;
初始化链表结构
/*初始化链表*/
LinkList initLinkList()
{
/*给这个链表一个头节点,以方便去访问*/
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
/*初始化这个头节点*/
tempHeader->data = '\0';
tempHeader->next = NULL;
/*返回这个头节点,以方便后续对链表进行操作*/
return tempHeader;
}
输出链表内容
/*输出链表中的数据*/
void printList(NodePtr paraHeader)
{
/*定义一个指针指向头结点的下一个位置*/
NodePtr p = paraHeader->next;
/*利用循环结构进行输出*/
while (p != NULL)
{
printf("%c",p->data);
p = p->next;
}
printf("\r\n");
}
操作链表数据
添加链表中的元素(尾部)
void appendElement(NodePtr paraHeader,char paraChar)
{
/*定义两个中间变量*/
NodePtr p,q;
/*为q创建一个链表单元,然后将q中的data赋予新加的值*/
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
q->next = NULL;
/*将头节点的地址赋予p*/
p = paraHeader;
/*利用循环到链表的末尾位置*/
while (p->next != NULL)
{
p= p->next;
}
/*现在开始增加*/
p->next = q;
}
在单链表的指定位置插入元素
void insertElement(NodePtr paraHeader,char paraChar, int paraPosition)
{
NodePtr p,q;
/*找到元素位置*/
p = paraHeader;
for(int i = 0;i < paraPosition; i ++)
{
p= p->next;
if(p == NULL)
{
printf("错误!!!请重新输入!!\r\n");
return;
}
}
/*获得新元素*/
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
/*添加*/
printf("linking\r\n");
q->next = p->next;
p->next = q;
}
删除元素
/*删除链表中的元素*/
void deleteElement(NodePtr paraHeader,char paraChar)
{
NodePtr p,q;
p = paraHeader;
/*找到需要的位置*/
while ((p->next != NULL) && (p->next->data != paraChar))
{
p = p->next;
}
if(p->next == NULL)
{
printf("找不到该元素!");
return;
}
q = p->next;
p->next = p->next->next;
free(q);
}
进行测试
void appendInsertDeleteTest()
{
/*初始化单链表*/
LinkList tempList = initLinkList();
printList(tempList);
/*添加元素*/
appendElement(tempList,'L');
appendElement(tempList,'I');
appendElement(tempList,'N');
appendElement(tempList,'L');
appendElement(tempList,'I');
appendElement(tempList,'N');
appendElement(tempList,'9');
printList(tempList);
/*删除元素*/
deleteElement(tempList,'L');
deleteElement(tempList,'I');
deleteElement(tempList,'N');
printList(tempList);
/*插入元素*/
insertElement(tempList,'S',0);
printList(tempList);
insertElement(tempList,'H',1);
printList(tempList);
insertElement(tempList,'I',2);
printList(tempList);
insertElement(tempList,'I',10);
printList(tempList);
}
测试结果