前言
在学习数据结构时最先接触的就是单链表,自己平常敲代码的时候因为不熟练常常出现结构混乱的情况,所以在这里稍微总结一下,并且给自己立个标准。
单链表有顺序存储和链式储存两种,但是因为顺序存储相对简单一些。这里只总结链式存储
主要函数
- 主要结构,初始化
typedef struct LNode *List;
struct LNode
{
ElementType Data;
List Last; // 非必须,尾节点
List Next;
};
- 创建链表
List creatLNode()
{
List L; // 头节点
L = (List)malloc(siezof(struct LNode));
L->Next = NULL;
return L; // 记得返回
}
- 添加节点
void addLNode(head)
{
List P, temple;
P = (Poly)malloc(sizeof(struct Poly));
P->Data = getData();
// 头插法
if (head->Next == NULL)
{
head->Next = P;
P->Next = NULL;
}
else
{
temple = head->Next;
head->Next = P;
P->Next = temple;
}
// 尾插法
if (head->Next == NULL)
{
head->Next = P;
P->Next = NULL;
head->Last = P;
}
else
{
temple = head->Last;
temple->Next = P;
P->Next = NULL;
}
// 其他插入法
// 循环找到需要的结构体,在使用头插法
// 让数据从小到大排列的例子
temple = L;
L = L->Next;
while (L != NULL)
{
if (P->Data < L->Data)
{
break;
}
temple = L;
L = L->Next;
}
// 这里放头插法的代码
}
- 查找节点
List findLNode(head)
{
ElementType data; // 需要找的数据
List L;
L = head->Next;
while (L != NULL)
{
if (L->Data == data)
{
break;
}
}
return L; // 主函数里面判断返回的值
}
- 删除
void delLNode(head)
{
ElementType data; // 需要删除的数据或者节点编号
List L, temple;
temple = L;
L = head->Next;
while (L != NULL)
{
if (L->Data == data)
{
temple->Next = L->Next;
free(L);
printf("删除成功\n");
break;
}
temple = L;
L = L->Next;
}
if (L == NULL)
{
printf("未找到\n"); // 给个提醒
}
}
说明
后来写代码的时候经常混乱的原因是,我是先学小甲鱼的c语言教程。里面涉及到了单链表的知识。小甲鱼创建头节点的方式与后来我在mooc上学浙大的数据结构时不太一样
小甲鱼是先创建一个指针,然后指向 NULL List head = NULL
,此时在插入新节点时需要传入二级指针,否则传入的头节点是 NULL 将毫无意义。
浙大老师用的是(或者我自己后来用的)先创建一个空数据的结构体做头节点。此时在后面使用这个单链表时需要注意空节点的存在,不要对空节点取 Data。