一,链表的概念
一个简单结点的结构体表示为:
typedef int DataType
typedef struct Node
{
DataType _data; /*数据成员可以是多个不同类型的数据*/
struct Node *_next; /*指针变量成员只能是-个*/
}Node,*pNode, *pList;
一个简单的单向链表的图示
1.链表是结构、指针相结合的一种应用,它是由头、中间、尾多个链环组成的单方向可伸缩的链表,链表上的链环我们称之为结点。
2.每个结点的数据可用一个结构体表示,该结构体由两部分成员组成:数据成员与结构指针变量成员。
3.数据成员存放用户所需数据,而结构指针变量成员则用来连接(指向)下一个结点,由于每一个结构指针变量成员都指向相同的结构体,所以该指针变量称为结构指针变量。
4.链表的长度是动态的,当需要建立一个结点,就向系统申请动态分配一个存储空间,如此不断地有新结点产生,直到结构指针变量指向为空(NULL)。申请动态分配一个存储空间的表示形式为:
(struct Node*)malloc(sizeof(struct Node))
二,对链表的基本操作
LINKLIST.H
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType; //结构定义
typedef struct Node
{
DataType _data;
struct Node* _next;
}Node, *pNode, *pList;
//初始化+销毁链表
void InitLinkList(pList* pplist);
void DestroyList(pList* pplist);
//尾部插入和删除元素
void PushBack(pList* pplist, DataType x);
void PopBack(pList* pplist);
//头部插入和删除元素
void PushFront(pList* pplist, DataType x);
void PopFront(pList* pplist);
//查找
pNode Find(pList plist, DataType x);
//指定位置插入和删除
void Insert(pList* pplist, pNode pos, DataType x);
void Erase(pList *pplist, pNode pos);
//删除指定元素
void Remove(pList* pplist, DataType x);
//删除指定的所有元素
void RemoveAll(pList* pplist, DataType x);
//单向链表的排序
Sort(pList *pplist);
//逆序单向链表
void ReverseList(pList* pplist);
//打印单向链表
void Display(pList plist);
#endif // __LINKLIST_H__
1.链表的初始化与销毁
void InitLinkList(pList* pplist) //链表初始化函数
{
assert(pplist);
*pplist = NULL;
}
void DestroyList(pList