链表介绍
介绍
链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
和顺序表的区别:
顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上也相邻,所以插入删除需要移动元素。链表使用指针链表示线形表元素的逻辑关系,插入和删除只需修改指针,不能随机存取。
代码实现
- typedef int DataType;
- typedef struct Node
- {//结构实现
- DataType data;
- struct Node* next;
- }Node, *PNode;
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;
- }
- }
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;