在学习数据结构时写的单链表,参考书目《数据结构与算法分析 C语言描述版》,大部分思路是从书上来的,不过对部分逻辑和方法进行了修改。
头文件SingleLinkList.h
#ifndef _SINGLE_LINK_LIST_
#define _SINGLE_LINK_LIST_
typedef struct Node* pNode;
typedef pNode List; // List为指向节点的指针
typedef pNode Position; // Position为指向节点的指针
typedef int ElementType;// 定义元素类型
struct Node
{
ElementType element; // 节点的数据
Position next; // 指向下一个节点的指针
};
List InitList(List L);// 初始化
int IsEmpty(List L);// 是否为空
int IsLast(Position P, List L);// P是否指向最后一个元素
Position FindElement(ElementType E, List L);// 在L中寻找第一个数据值为E的节点,返回指向该节点的指针
void DeleteElement(ElementType E, List L);// 在L中删除第一个数据值为E的节点
Position FindPrevious(ElementType E, List L);// 在L中寻找第一个数据值为E的节点的前驱元,返回指向前驱元的指针,找不到返回指向最后一个节点的指针
void InsertElememt(ElementType E, List L, Position P);// 在P所指向的节点后插入一个节点,节点数据值为E
ElementType Retrive(Position P, List L);// 获得P所指向节点的数据值
void EmptyList(List L);// 清空一个链表
void DeleteList(List L);// 删除一个链表
#endif // _SINGLE_LINK_LIST_
源文件SingleLinkList.c
#include <stdlib.h>
#include <stddef.h>
#include <assert.h>
#include "SingleLinkList.h"
List InitList(List L)
{
L = (struct Node*)malloc(sizeof(struct Node));
L->next = NULL;
return L;
}
int IsEmpty(List L)
{
return L->next == NULL;
}
int IsLast(Position P, List L)
{
return P->next == NULL;
}
Position FindElement(ElementType E, List L)
{
Position p;
while(p != NULL && p->element != E)
{
p = p->next;
}
return p;
}
void DeleteElement(ElementType E, List L)
{
Position p, tmp;
p = FindPrevious(E, L);
if (!IsLast(p, L))
{
tmp = p->next;
p->next = tmp->next;
free(tmp);
}
}
Position FindPrevious(ElementType E, List L)
{
Position p;
p = L;
while(p->next != NULL && p->next->element != E)
{
p = p->next;
}
return p;
}
void InsertElememt(ElementType E, List L, Position P)
{
pNode tmp = (struct Node*)malloc(sizeof(struct Node));
assert(tmp != NULL);
tmp->element = E;
tmp->next = P->next;
P->next = tmp;
}
ElementType Retrive(Position P, List L)
{
/*if (P != L)//确定P指向的不是头结点
{
return P->element;
}*/
return P->element;
}
void EmptyList(List L)
{
Position p, tmp;
p = L->next;
L->next = NULL;
while (p != NULL)
{
tmp = p;
p = p->next;
free(tmp);
}
}
void DeleteList(List L)
{
EmptyList(L);
free(L);
}
主程序验证,main.c
#include <stdio.h>
#include <stdlib.h>
#include "SingleLinkList.h"
int main()
{
printf("Hello JK!\n");
List myList;
myList = InitList(myList);
// 循环从头插入10个元素
int i = 0;
for (i = 0; i < 10; ++i)
{
InsertElememt(i, myList, myList);
}
// 输出元素
Position p = myList->next;
while (p != NULL)
{
printf("%d ", p->element);
p = p->next;
}
printf("\n");
// 删除元素值为3的节点并输出删除后的链表
DeleteElement(3, myList);
p = myList->next;
while (p != NULL)
{
printf("%d ", p->element);
p = p->next;
}
printf("\n");
// 清空链表
EmptyList(myList);
p = myList->next;
while (p != NULL)
{
printf("%d ", p->element);
p = p->next;
}
printf("\n");
// 删除整个链表
DeleteList(myList);
return 0;
}