介绍
链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
和顺序表的区别:
顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上也相邻,所以插入删除需要移动元素。链表使用指针链表示线形表元素的逻辑关系,插入和删除只需修改指针,不能随机存取。
代码实现
typedef int DataType;
typedef struct Node
{//结构实现
DataType data;
struct Node* next;
}Node, *PNode;
void InitList(PNode* PHead)//初始化
{
assert(PHead);
*PHead = NULL;
}
PNode ByeNode(DataType data)//申请一个结点
{
PNode newNode = NULL;
newNode = (PNode)malloc(sizeof(Node));
if (NULL == newNode)
{
printf("out of memory.\n");
exit(1);
}
else
{
newNode->data = data;
newNode->next = NULL;
}
return newNode;
}
void PopBack(PNode* PHead)//尾删
{
assert(PHead);
if (NULL == *PHead)
{
return;
}
else if(NULL == (*PHead)->next)
{
PNode TempNode = *PHead;
free(TempNode);
TempNode = NULL;
*PHead = NULL;
}
else
{
PNode PCur = *PHead;
while (PCur->next->next)
{
PCur = PCur->next;
}
PCur->next = NULL;
}
}
void PushBack(PNode* PHead, DataType data)//尾插
{
assert(PHead);
if (NULL == *PHead)
{
*PHead = ByeNode(data);
}
else
{
PNode PCur = NULL;
PCur = *PHead;
while (PCur->next)
{
PCur = PCur->next;
}
PCur->next = ByeNode(data);
}
}
void PushFront(PNode *PHead, DataType data)//头插
{
assert(PHead);
PNode PreNode = NULL;
PNode Node = ByeNode(data);
PreNode = *PHead;
Node->next = PreNode;
*PHead = Node;
}
void PopFront(PNode *PHead)//头删
{
assert(PHead);
PNode PreNode = *PHead;
if (NULL == *PHead)
{
return;
}
else if (NULL == (*PHead)->next)
{
*PHead = NULL;
}
else
{
*PHead = PreNode->next;
free(PreNode);
PreNode = NULL;
}
}
PNode Find(PNode* PHead, DataType data)//查找
{
assert(PHead);
PNode PCur = *PHead;
while (PCur)
{
if (data == PCur->data)
break;
PCur = PCur->next;
}
return PCur;
}
void Destroy(PNode* PHead)//销毁
{
assert(PHead);
PNode PCur = *PHead;
while (PCur->next)
{
PNode Dnode = PCur;
PCur = PCur->next;
free(Dnode);
Dnode = NULL;
}
}
int Empty(PNode PHead)//判空
{
if (NULL == PHead)
return 0;
else
return 1;
}
int Size(PNode PHead)//求链表中结点的个数
{
PNode Node = PHead;
DataType num = 0;
while (Node)
{
num++;
Node = Node->next;
}
return num;
}
void PrintList(PNode* PHead)//打印单链表
{
PNode PCur = *PHead;
assert(PHead);
while (PCur)
{
printf("%d->",PCur->data);
PCur = PCur->next;
}
printf("NULL\n");
}
void Insert(PNode pos, DataType data)//在data后插入结点
{
PNode newNode = ByeNode(data);
PNode PreNode = pos;
newNode->next = PreNode->next;
PreNode->next = newNode;
}