不带头结点的单链表和带头结点的单链表
和带有头结点的单链表相比,不带头结点的单链表显得更直观。但不带头结点的单链表在插入和删除第 1 个元素时与插入和删除其它元素时的操作不一样,在创建链表时也不一样,要改变链表头指针的值。而带有头点的单链表无论插入和删除第几个元素,其操作都是统一的。
对插入和删除参数传递存在问题,以及对程序运行后出现的乱码存在问题
不带头结点链表实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define Destroy Clear //Destroy和Clear操作是一样的
//和设头结点的单链表在定义存储结构上是相同的
typedef struct Node
{
int data; //数据域
struct Node *next; //指针域
}NODE,*PNODE;
//基本操作
PNODE Create1(); //创建无头结点的单链表,在表头插入数据
PNODE Create2(); //创建无头结点的单链表,在表尾插入数据
void Clear(PNODE pHead);//置空或销毁单链表,
bool Empty(PNODE pHead);//判断单链表是否为空
int Length(PNODE pHead);//返回单链表中元素的个数
bool Get(PNODE pHead,int i,int *e);//将第i个元素的值赋给e
bool Prior(PNODE pHead,int cur_e,int *pre_e);//求cur_e的前驱元素,用pre_e保存
bool Next(PNODE pHead,int cur_e,int *next_e);//求cur_e的后继元素,用next_e保存
bool Insert(PNODE *pHead,int i,int e);//在第i个元素前面插入元素e
bool Delete(PNODE *pHead,int i,int *e);//删除单链表第i个元素,并用e保存
void Traverse(PNODE pHead);//遍历单链表
void Sort(PNODE pHead);//排序
int main()
{
int val;
PNODE pHead=Create1();
printf("初始化链表中的元素为:");
Traverse(pHead);
Get(pHead,3,&val);
printf("第3个元素的值为:%d\n",val);
Insert(&pHead,6