首先我们得了解一下什么是链表?什么是单链表
所谓链表其实就是一些包含数据的独立数据结构(通常称为结点)的集合,链表中的每个结点通过链或指针连接在一起,程序通过指针访问链表中的结点。
在单链表中,每个结点包含一个指向链表下一个结点的指针,链表最后一个结点的指针字段的值为NULL。
下图为单链表的具体实现方式图
下面我们用代码来简单实现一下~
LinkList.h //函数声明
#ifndef _LINKLIST_H__
#define _LINKLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef int DataType;//假设结点的数据域类型为整型
typedef struct Node//结点类型定义
{
DataType data;//结点的数据域
struct Node* next;//结点的指针域
}Node, *pNode, *pList;
void InitLinkList(pList* pplist);
void Display(pList pl);//打印
void PushFront(pList* pplist, DataType x);//头插
void PopFront(pList* pplist);//头删
void PushBack(pList* pplist, DataType x);//尾插
void PopBack(pList* pplist);//尾删
pNode Find(pList pl, DataType d); //查找
void Remove(pList *pplist, DataType x);//删除链表中指定元素
void Destroy(pList* pplist);//销毁
void Show(pList pl);//逆序打印(递归实现)
void DelNotTail(pNode pos);//删除无头链表的非尾节点
void InsertFrontNode(pNode pos, DataType d);//当前节点插入一个数据
LinkList.c //函数的具体实现
#define _CRT_SECURE_NO_WARNINGS 1
#include"LinkList.h"
void InitLinkList(pList* pplist)//初始化
{
assert(pplist != NULL);
*pplist = NULL;
}
void Display(pList pl)
{
if (pl == NULL)
{
return;
}
while (pl)
{
printf("%d-->", pl->data);
pl = pl->next;
}
printf("over\n");
}
void PushFront(pList* pplist, DataType d)//头插
{
assert(pplist);
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL)
{
perror("use malloc");
exit(EXIT_FAILURE);
}
newNode->data = d;
newNode->next = NULL;
newNode->next = *pplist;
*pplist = newNode;
}
void PopFront(pList* pplist)
{
assert(pplist);
pNode cur = *pplist;
if (cur == NULL)
{
return;
}
else
{
*pplist = cur->next;
free(cur);
}
}
void PushBack(pList* pplist, DataType d)
{
pNode head = *pplist;
pNode cur = NULL;
pNode newnode = (Node*)malloc(sizeof(Node));
if (newnode == NULL)
{
perror("use malloc");
exit(EXIT_FAILURE);
}
newnode->data = d;
newnode->next = NULL;
if (head == NULL)
{
*pplist = newnode;
newnode->data = d;
newnode->next = NULL;
}
else
{
while (head != NULL)
{
cur = head;
head = head->next;
}
cur->next = newnode;
}
}
void PopBack(pList* pplist)
{
pNode prev = NULL;
pNode cur = *pplist;
if (*pplist == NULL)
{
return;
}
while (cur->next != NULL)
{
prev = cur;
cur = cur->next;
}
if (prev != NULL)
{
prev->next = NULL;
free(cur);
}
else
{
free(cur);
*pplist = NULL;
}
}
pNode Find(pList pl, DataType d)
{
pNode cur = pl;
while (cur != NULL)
{
if (cur->data == d)
{
return cur;
}
cur = cur->next;
}
return NULL;
}
void Remove(pList *pplist, DataType d)//删除链表中指定元素
{
assert(pplist);
pNode prev = NULL;
pNode cur = Find(*pplist, d);
if (cur == NULL)
{
return;
}
prev = cur->next;
cur->data = prev->data;
cur->next = prev->next;
free(prev);
prev->next = NULL;
}
void Destroy(pList* pplist)
{
free(*pplist);
pplist = NULL;
}
void Show(pList pl)
{
if (pl == NULL)
{
return;
}
else
{
Show(pl->next);
printf("%d-->", pl->data);
}
}
void DelNotTail(pNode pos)
{
assert(pos != NULL);
pNode del = NULL;
del = pos->next;
pos->data = del->data;
pos->next = del->next;
free(del);
del->next = NULL;
}
void InsertFrontNode(pNode pos, DataType d)
{
pNode new = (Node*)malloc(sizeof(Node));
if (new == NULL)
{
perror("use malloc");
exit(EXIT_FAILURE);
}
else
{
new->data = pos->data;
pos->data = d;
new->next = pos->next;
pos->next = new;
}
}
test.c //函数测试
#define _CRT_SECURE_NO_WARNINGS 1
#include"LinkList.h"
void test1()//头插和头删的测试
{
pList plist;
InitLinkList(&plist);
PushFront(&plist, 1);
PushFront(&plist, 2);
PushFront(&plist, 3);
PushFront(&plist, 4);
Display(plist);
PopFront(&plist);
Display(plist);
PopFront(&plist);
Display(plist);
PopFront(&plist);
Display(plist);
PopFront(&plist);
Display(plist);
Destroy(&plist);
}
void test2()
{
pList plist;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
Display(plist);
PopBack(&plist);
Display(plist);
PopBack(&plist);
Display(plist);
PopBack(&plist);
Display(plist);
PopBack(&plist);
Display(plist);
Destroy(&plist);
}
void test3()
{
pList plist;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
Display(plist);
Remove(&plist, 3);
Display(plist);
Destroy(&plist);
}
void test4()
{
pList plist;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
Display(plist);
Show(plist);
Destroy(&plist);
}
void test5()
{
pList plist;
pNode find = NULL;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
Display(plist);
find= Find(plist, 3);
DelNotTail(find);
Display(plist);
Destroy(&plist);
}
void test6()
{
pList plist;
pNode find = NULL;
InitLinkList(&plist);
PushBack(&plist, 1);
PushBack(&plist, 2);
PushBack(&plist, 3);
PushBack(&plist, 4);
Display(plist);
find = Find(plist, 3);
InsertFrontNode(find, 5);
Display(plist);
Destroy(&plist);
}
int main()
{
//test1();
//test2();
//test3();
//test4();
//test5();
test6();
getchar();
return 0;
}