线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数组元素的存储映像,称为结点。它包括两个域:其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。链表的每个结点中只包含一个指针,所有称线性链表或单链表。
基本操作
InitLinkList(&plist);//初始化链表为空链表
PushBack(&plist,1); // 尾插
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 5);
ShowLinkList(plist);//12345
len = GetListLength(plist);
printf("len=%d\n",len);
PopBack(&plist); //尾删 1234
ShowLinkList(plist);
//DestroyLinkList(&plist);//销毁
PushFront(&plist, 9);//头插
PushFront(&plist, 6);
PushFront(&plist, 7);
ShowLinkList(plist);//7691234
PopFront(&plist);//头删 691234
ShowLinkList(plist);
Node *ret = NULL;
ret=Find(plist, 3);//找元素
if (ret != NULL)
{
printf("%d\n", ret->data);
}
Node* pos = NULL;
pos = Find(plist, 3);
Insert(&plist, pos, 7);//指定位置插入元素 6912734
ShowLinkList(plist);
pos = Find(plist, 1);
Erase(&plist, pos);//指定位置删除元素 692734
ShowLinkList(plist);
Remove(&plist, 3);//指定元素删除 69274
ShowLinkList(plist);
PushBack(&plist, 6);
ShowLinkList(plist);
RemoveAll(&plist, 6);//指定元素删除所有指定元素 9274
ShowLinkList(plist);
DestroyLinkList(&plist);//销毁
代码块实现
头文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType;
typedef struct Node
{
DataType data;//数据域
struct Node*next;//指针域
}Node;
void InitLinkList(Node** pplist);
void DestroyLinkList(Node** pplist);
void PushBack(Node** pplist, DataType d);
void PopBack(Node** pplist);
void ShowLinkList(Node* plist);
int GetListLength(Node* plist);
void PushFront(Node** pplist, DataType d);
void PopFront(Node** pplist);
Node* Find(Node* plist, DataType d);
void Insert(Node** pplist, Node* pos, DataType d);
void Erase(Node** pplist, Node* pos);
void Remove(Node** pplist, DataType d);
void RemoveAll(Node** pplist, DataType d);
#endif
主要功能实现
#include"LinkList.h"
void InitLinkList(Node**pplist)//初始化数组
{
assert(pplist);
*pplist = NULL;
}
void DestroyLinkList(Node **pplist)//销毁
{
Node *cur = NULL;
Node *del = NULL;
assert(pplist);
cur = *pplist;
while (cur)
{
del = cur;
//printf("%p\n", del);
cur = cur->next;
free(del);
del = NULL;
}
*pplist = NULL;
}
Node *BuyNode(DataType d)//构造新的结点
{
Node*ptr = (Node*)malloc(sizeof(Node));
if (ptr == NULL)//如果开辟内存失败,则提示且不再往下走
{
perror("PushBack:maclloc()");
return NULL;
}
ptr->data = d;
ptr->next = NULL;
return ptr;
}
void PushBack(Node**pplist, DataType d)
{
Node * newNode = NULL;
assert(pplist);
newNode = BuyNode(d);
//printf("%p\n", newNode);
//无节点
if (*pplist == NULL)
{
*pplist = newNode;
}
else//有节点
{
Node *cur = *pplist;
while (cur->next)
{
cur = cur->next;
}
cur->next = newNode;
}
}
void ShowLinkList(Node*plist)
{
Node *cur = plist;
while (cur)
{
printf("%d-->", cur->data);
cur = cur->next;
}
printf("NULL\n");
}
int GetListLength(Node*plist)
{
Node *cur = plist;
int count = 0;
while (cur != NULL)
{
count++;
cur = cur->next;
}
return count;
}
void PopBack(Node **pplist)
{
assert(pplist);
//空链表
if (*pplist==NULL)
{
return;
}
else if ((*pplist)->next == NULL)//一个节点
{
free(*pplist);
*pplist = NULL;
}
else
{
Node*cur = *pplist;
while (cur->next->next != NULL)
{
cur = cur->next;
}
free(cur->next);
cur->next = NULL;
}
}
void PushFront(Node **pplist, DataType d)
{
/*if (*pplist == NULL)
{
*pplist = BuyNode(d);
}
else
{
Node *newNode = BuyNode(d);
newNode->next = *pplist;
*pplist = newNode;
}
*/
Node *newNode =NULL;
assert(pplist);
newNode = BuyNode(d);
newNode->next = *pplist;
*pplist = newNode;
}
void PopFront(Node** pplist)
{
if (*pplist == NULL)
{
return;
}
else
{
Node*del = *pplist;
*pplist = (*pplist)->next;
free(del);
del = NULL;
}
}
Node* Find(Node* plist, DataType d)
{
Node* cur = plist;
while (cur)
{
if (cur->data == d)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Insert(Node** pplist, Node* pos, DataType d)
{
Node* newNode = NULL;
assert(pplist);
assert(pos);
if (*pplist == NULL)
{
return;
}
newNode = BuyNode(d);
//pos是第一个节点
if(pos== *pplist)
{
newNode->next = pos;
*pplist = newNode;
}
//pos不是第一个节点
else
{
Node* prev = *pplist;
while (prev&&prev->next != pos)
{
prev = prev->next;
}
if (prev != NULL)
{
newNode->next = pos;
prev->next = newNode;
}
}
}
void Erase(Node** pplist, Node* pos)
{
assert(pplist && pos);
if (*pplist == NULL)
{
return;
}
//pos是第一个节点
if (pos == *pplist)
{
*pplist = pos->next;
free(pos);
pos = NULL;
}
else//pos是中间节点
{
Node* prev = *pplist;
while (prev && prev->next != pos)
{
prev = prev->next;
}
if (prev != NULL)
{
prev->next = pos->next;
free(pos);
pos = NULL;
}
}
}
void Remove(Node** pplist, DataType d)
{
Node* cur = NULL;
Node* prev = NULL;
assert(pplist);
if (*pplist == NULL)
return;
cur = *pplist;
while(cur)
{
if (cur->data == d)
{
if (*pplist ==cur)//删除的是第一个节点
{
*pplist = cur->next;
free(cur);
cur = NULL;
}
else//删除的是中间节点
{
prev->next = cur->next;
free(cur);
cur = NULL;
}
break;
}
prev = cur;
cur = cur->next;
}
}
void RemoveAll(Node** pplist, DataType d)
{
Node* cur = NULL;
Node* prev = NULL;
assert(pplist);
if (*pplist == NULL)
return;
cur = *pplist;
while (cur)
{
if (cur->data == d)
{
if (*pplist == cur)//删除的是第一个节点
{
*pplist = cur->next;
free(cur);
cur = *pplist;
}
else//删除的是中间节点
{
prev->next = cur->next;
free(cur);
cur = prev;
}
}
prev = cur;
cur = cur->next;
}
}
测试代码
#include"LinkList.h"
void test()
{
Node*plist;
int len = 0;
InitLinkList(&plist);//初始化链表为空链表
PushBack(&plist,1); // 尾插
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
PushBack(&plist, 5);
ShowLinkList(plist);//12345
len = GetListLength(plist);
printf("len=%d\n",len);
PopBack(&plist); //尾删 1234
ShowLinkList(plist);
//DestroyLinkList(&plist);//销毁
PushFront(&plist, 9);//头插
PushFront(&plist, 6);
PushFront(&plist, 7);
ShowLinkList(plist);//7691234
PopFront(&plist);//头删 691234
ShowLinkList(plist);
Node *ret = NULL;
ret=Find(plist, 3);//找元素
if (ret != NULL)
{
printf("%d\n", ret->data);
}
Node* pos = NULL;
pos = Find(plist, 3);
Insert(&plist, pos, 7);//指定位置插入元素 6912734
ShowLinkList(plist);
pos = Find(plist, 1);
Erase(&plist, pos);//指定位置删除元素 692734
ShowLinkList(plist);
Remove(&plist, 3);//指定元素删除 69274
ShowLinkList(plist);
PushBack(&plist, 6);
ShowLinkList(plist);
RemoveAll(&plist, 6);//指定元素删除所有指定元素 9274
ShowLinkList(plist);
DestroyLinkList(&plist);//销毁
}
int main()
{
test();
return 0;
}
成果展现