# 单链表
文中提到的内容的链接一并列在这里:
@ 昨天用6个小时将单链表初步成型,那么说好的高质版就在今天完成!
@ 首先,因为前面实现过顺序表,就先来说说顺序表和单链表的区别吧!(画图功底太差,本篇无插图)
@ 顺序表存储位置是相邻连续的,可以随即访问的一种数据结构,一个顺序表在使用前必须指定起长度,一旦分配内
存,则在使用中不可以动态的更改。他的优点是访问数据是比
较方便,可以随即的访问表中的任何一个数据。
@ 链表是通过指针来描述元素关系的一种数据结构,他可以是物理地址不连续的物理空间。不能随即访问链表元素,
必须从表头开始,一步一步搜索元素。它的优点是:对于数
组,可以动态的改变数据的长度,分配物理空间。
@ 在使用中:如果一个数组在使用中,查询比较多,而插入,删除数据比较少,数组的长度不变时,选顺序表比较合
理。如果插入,删除,长度不定的数组,可以选链表。
# 我在这篇文章将函数功能一个一个列出来单独说明,最后将全部综合在一起列出来;
先将自定义的头文件包含一些函数的声明列出来,还有主函数包含测试部分,请先看这部分,方便理解后面的内容!
代码中包含部分注释!!!
@ “LinkList.h”
#define _CRT_SECURE_NO_WARNINGS 1//消除scanf的警告!
#ifndef __LINKLIST_H__//防止头文件的重定义
#define __LINKLIST_H__
//将所有引入的头文件都放到自定义的头文件中即可!
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;//将int重命名,方便修改,如果元素是char只需要将int改为char;
enum Select//将所有选项用枚举表现出来,方便阅读;很有必要的操作,增强代码的可读性;
{
EXIT,
INSERT,
PRINT,
REMOVE,
REMOVEALL,
SEARCH,
SORT,
PUSHF,
PUSHB,
POPF,
POPB,
DOSTORY,
EASER,
};
typedef struct LinkNode
{
DataType data;
struct LinkNode* next;
}LinkNode,*pLinkNode;//结点结构体
typedef struct LinkList//将头指针单独封装一个结构体方便使用!
{
LinkNode* pHead;//头结点指针
}LinkList ,*pLinkList;//链表
void InitLinkList(pLinkList pList);//初始化列表
void PrintList(pLinkList pList);//打印
void DostoryList(pLinkList pList);//free链表
void PopBack(pLinkList pList);//尾删
void PopFront(pLinkList pList);//头删
void PushBack(pLinkList pList,DataType x);//尾插
void PushFront(pLinkList pList,DataType x);//头插
void Insert(pLinkList pList,pLinkNode pos,DataType x);//指定位置前或者后插入元素
pLinkNode Find(pLinkList pList,DataType x);//查找
void Search(pLinkList pList,DataType x);//查找指定元素;
void Remove(pLinkList pList,DataType x);//删除指定元素
void RemoveAll(pLinkList pList,DataType x);//删除所有出现的指定元素
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置的元素
void BubbleSort(pLinkList pList);//冒泡排序链表元素
void Exit(pLinkList pList);
#endif //__LINKLIST_H__
@ test.c
#include"LinkList.h"
//注意:请仔细阅读自定义头文件"LinkList.h"的内容!!!
//打印菜单这个,主要看自己喜好,设计的好看一点总是没问题的;
//注意的是你每次进行选择一个操作前都要打印一次菜单!
void Print()
{
printf("\n————————————————————\n");
printf("***************************************\n");
printf("**** 0.退出 ******\n");
printf("**** 1. 插入元素 ******\n");
printf("**** 2. 打印链表 ******\n");
printf("**** 3. 删除指定元素 ******\n");
printf("**** 4. 删除所有出现的指定元素 ******\n");
printf("**** 5. 查找 ******\n");
printf("**** 6. 排序 ******\n");
printf("**** 7. 头插 ******\n");
printf("**** 8. 尾插 ******\n");
printf("**** 9. 头删 ******\n");
printf("**** 10. 尾删 ******\n");
printf("**** 11. 释放链表 ******\n");
printf("**** 12. 删除指定位置的元素 ******\n");
printf("***************************************\n");
printf("\n—