代码如下:
#include "stdio.h"
#include "stdlib.h"
typedef struct LNode { //定义单链表结点类型
int data; //每个节点存放一个数据元素
struct LNode *next; //指针指向下一个结点
} LNode, *LinkList;
//初始化一个单链表(带头结点)
bool InitList(LinkList &L) {
L = (LNode *)malloc(sizeof(LNode));//分配一个头结点
if(L==NULL) //内存不足,分配失败
return false;
L->next = NULL; //头节点之后暂时还没有结点
return true;
}
//判断单链表是否为空(带头结点)
bool Empty(LinkList L) {
return L->next==NULL;
}
//后插操作:在p结点后插入元素e
bool InsertNextNode(LNode *p, int e) {
if(p==NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if(s==NULL) //内存分配失败 ,某些情况下有可能分配失败,如内存不足
return false;
s->data = e; //用结点s保存数据元素e
s->next = p->next;
p->next = s; //将结点s连到p之后
return true;
}
//前插操作:在p结点之前插入元素e
bool InsertPriorNode(LNode *p, int e) {
if(p==NULL)
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
if(s=NULL) //内存分配失败
return false;
s->next = p->next;
p->next = s; //新结点s连接到p之后
s->data = p->data; //将p中元素复制到s中
p->data = e; //p中元素覆盖为e
return true;
}
//按位查找,返回第 i个元素(带头结点)
LNode * GetElem(LinkList L, int i) {
if(i<0)
return NULL;
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i) { //循环找到第i-1个结点
p=p->next;
j++;
}
return p;
}
//在第i个位置插入元素e(带头结点)
bool ListInsert(LinkList &L, int i, int e) {
if(i<1)
return false;
/*可以使用下一行的 GetElem(L, i-1)找到并返回第i-1个结点
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i-1) { //循环找到第i-1个结点
p=p->next;
j++;
}*/
LNode *p = GetElem(L, i-1); //找到第i-1个结点
return InsertNextNode(p, e);//p后插入新元素
//可用上一行的InsertNextNode(p, e)后插函数在p结点后插元素e
/*
if(p==NULL) //i值不合法
return false;
LNode *s = (LNode *)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s; //将结点s连到p之后
return true; //插入成功
*/
}
//按位序删除(带头结点)
bool ListDelete(LinkList &L, int i, int &e) {
if(i<1)
return false;
LNode *p = GetElem(L, i-1); //找到第i-1个结点
/*
LNode *p; //指针p指向当前扫描到的结点
int j=0; //当前p指向的是第几个结点
p = L; //L指向头结点,头结点是第0个结点(不存数据)
while(p!=NULL && j<i-1) { //循环找到第i-1个结点
p=p->next;
j++;
}*/
if(p==NULL) //i值不合法
return false;
if(p->next == NULL) //第i-1个结点之后已无其他结点
return false;
LNode *q=p->next; //令q指向被删除结点
e = q->data; //用e返回元素的值
p->next=q->next; //将*q结点从链中断开
free(q); //释放结点的存储空间
return true; //删除成功
}
//删除指定结点 p
//注意:如果p是最后一个结点会出错,p->data=p->next->data(为NULL)中会空指针异常
bool DeleteNode (LNode *p) {
if(p==NULL)
return false;
LNode *q=p->next; //令q指向*p的后继结点
p->data=p->next->data; //和后继结点交换数据域
p->next=q->next; //将*q结点从链中断开
free(q); //释放后继结点的存储空间
return true;
}
//按值查找,找到数据域==e 的结点
LNode * LocateElem(LinkList L,int e) {
LNode *p = L->next;
//从第1个结点开始查找数据域为e的结点
while(p != NULL && p->data != e)
p = p->next;
return p; //找到后返回该结点指针,否则返回NULL
}
//求表的长度
int Length(LinkList L){
int len = 0; //统计表长
LNode *p = L;
while(p->next != NULL){
p = p->next;
len++;
}
return len;
}
//尾插法建立单链表
LinkList List_TailInsert(LinkList &L){ //正向建立单链表
int x; //设ElemType为整型
L=(LinkList)malloc(sizeof(LNode)); //建立头结点
LNode *s,*r=L; //r为表尾指针
scanf("%d", &x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r = s; //r指向新的表尾结点
scanf("%d", &x);
}
r->next=NULL; //尾结点指针置空
return L;
}
//头插法建立单链表 ,有逆置的应用
LinkList List_HeadInsert(LinkList &L){ //逆向建立单链表
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode)); //创建头结点
L->next=NULL; //初始为空链表
scanf("%d", &x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode *)malloc(sizeof(LNode)); //创建新结点
s->data=x;
s->next=L->next;
L->next = s; //将新结点插入表中,L为头指针
scanf("%d", &x);
}
return L;
}
int main() {
LinkList L;
InitList(L);
for(int i=1; i<=3; i++) {
ListInsert(L, i, i);
}
printf("ok\n");
LNode *q;
for(int i=1; i<=3; i++) {
q = GetElem(L, i);
printf("%d\n", q->data);
}
return 0;
}