关于单链表的创建及基本的操作,网上已经有很多,但是一些仅仅是把函数罗列出来,关于怎么使用这些函数,并没有说明。
在下面的程序中,我对每个函数都进行了验证,并且打印出了结果,利于初学者掌握。
/*******************************************************************/
//描述:单链表的创建,插入,删除等基本操作的函数,以及对这些操作进行验证
//时间:2017.12.25 22:00
//作者:Liu ZhenHua
//*****************************************************************/
#include <stdio.h>
#include <stdlib.h>
#define Status int
#define ERROR 0
#define FALSE 0
#define OK 1
#define TRUE 1
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *Linklist;
Status GetElem(Linklist L,int i,ElemType *e); //读取特定位置的某个元素
Status ListInsert(Linklist L,int i,ElemType e); //在特定位置插入特定元素
Status ListDelete(Linklist L,int i,ElemType *e);//在特定位置删除某一元素
void CreatListTail(Linklist L,int n); //创建头插法单链表
void CreatListHead(Linklist *L,int n); //创建尾插发单链表
void ClearList(Linklist *L); //清空整个链表
int ListLength(Linklist L); //读取链表长度
int main()
{
int i,length,value,*pvalue=&value;
Linklist *newl,p;
newl = (Linklist*)malloc(sizeof(Linklist*)); //分配空间
CreatListHead(newl,10); //建立一个10个结点的链表(不包括头结点)
p = *newl;
length = ListLength(p);
printf("链表长度为:%d\n打印链表元素:\n",length);
for(i=1;i<length+1;i++){ //打印链表
if(GetElem(p,i,pvalue)){
printf("第%d个元素 = %d\n",i,*pvalue);
}
}
if(ListDelete(p,5,pvalue)){ //删除掉第5个元素
printf("删除掉第5个元素:%d\n",*pvalue);
}
length = ListLength(p);
printf("链表长度为: %d\n",length);
printf("删除掉第%d个元素后,打印输出:\n",5);
for(i=1;i<length+1;i++){ //删除掉第5个元素后进行打印
if(GetElem(p,i,pvalue)){
printf("第%d个元素 = %d\n",i,*pvalue);
}
}
if(GetElem(p,9,pvalue)){ //取出第9个元素
printf("取出第9个元素为:%d\n",*pvalue);
}
ClearList(newl); //清空整个链表
printf("清空整个链表后");
length = ListLength(p);
printf("清空整个链表后,链表长度为:%d\n",length);//打印输出清除整个链表后的长度
return 0;
}
/**********************************************/
//函数名:GetElem
//描述 :取出第i个元素
//参数 :线性表L,i,e
//返回值:状态值
Status GetElem(Linklist L,int i,ElemType *e){
int k = 0;
Linklist p = L; //声明一个链表指针
while(p && k < i){
p = p->next;
k++;
}
if(!p){
return ERROR; //第i个结点不存在
}
*e = p->data;
return OK;
}
/**********************************************/
//函数名:ListInsert
//描述 :在第i个位置,插入一个新元素e
//参数 :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListInsert(Linklist L,int i,ElemType e){
Linklist p = L;Linklist s;
int k = 0;
while(p && k < i-1){
p = p->next;
k++;
}
if(!p)return ERROR; //结点不存在
s = (Linklist)malloc(sizeof(Node)); //生成一个新结点
s->next = p->next;
p->next = s;
s->data = e; //新结点的数据域赋值
return OK;
}
/**********************************************/
//函数名:ListDelete
//描述 :在第i个位置,删除该元素,并返回它的值e
//参数 :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListDelete(Linklist L,int i,ElemType *e){
Linklist p = L;Linklist q;
int k = 0;
while(p && k < i-1){
p = p->next;
k++;
} //将指针定位到a(i-1)
if(!p)return ERROR; //结点不存在
q = p->next; //q指向第i个结点
*e = q->data;
p->next=q->next;
free(q); //让系统回收此结点,释放内存
return OK;
}
/**********************************************/
//函数名:CreatListH
//描述 :随机产生n个数,建立带表头结点的单链线性表,头插法,即新产生的结点永远在第一个位置
//参数 :链表指针L,i
//返回值:状态值
/**********************************************/
void CreatListHead(Linklist *L,int n){
int i,randValue;
Linklist p;
*L = (Linklist)malloc(sizeof(Node));
(*L)->next = NULL;
srand(time(0)); //time(0)是得到当前时间,srand()是初始化随机种子
for(i = 0; i < n; i++){
p = (Linklist)malloc(sizeof(Node)); //生成一个新结点
randValue = rand()%100 + 1; //产生0-100的随机数
p->data = randValue;
p->next = (*L)->next;
(*L)->next = p;
}
}
/**********************************************/
//函数名:CreatListTail
//描述 :随机产生n个数,建立带表头结点的单链线性表,头插法,即新产生的结点永远在第一个位置
//参数 :链表指针L,i
//返回值:状态值
/**********************************************/
void CreatListTail(Linklist *L,int n){
int i,randValue;
Linklist p;
*L = (Linklist)malloc(sizeof(Node));
temp = *L;
srand(time(0)); //time(0)是得到当前时间,srand()是初始化随机种子
for(i = 0; i < n; i++){
p = (Linklist)malloc(sizeof(Node)); //生成一个新结点
randValue = rand()%100 + 1; //产生0-100的随机数
p->data = randValue;
temp->next = p;
temp = p;
}
temp ->next = NULL;
}
/**********************************************/
//函数名:ClearList
//描述 :删除整个链表
//参数 :链表指针L
//返回值:状态值
/**********************************************/
void ClearList(Linklist *L){
Linklist p,q;
p = (*L)->next;
while(p){
q = p->next;
free(p);
p = q;
}
(*L)->next=NULL;
}
/**********************************************/
//函数名:ListLength
//描述 :删除整个链表
//参数 :链表指针L
//返回值:状态值
/**********************************************/
int ListLength(Linklist L){
int n=0;
L = L->next;
while(L){
L=L->next;
n++;
}
return n;
}