头文件:
#include"stdlib.h"
#include"iostream.h"
typedef int status;
typedef int ElemType;
//链表节点及链表数据表示定义
typedef struct SingleLinkNode{
ElemType data; //代表数据域
struct SingleLinkNode *next; //代表指针域,指向直接后继元素
}SingleLinkNode,*SingleLinkList;
//以下是单向链表操作函数原型
status InitSingleLinkList(SingleLinkList &l);//初始化操作
void DestroySingleLinkList(SingleLinkList &l);//链表销毁操作
void ClearSingleLinkList(SingleLinkList &l);//链表清除操作
int SingleLinkListLength(SingleLinkList l);//链表长度
bool SingleLinkListEmpty(SingleLinkList l);//链表是否为空
status GetSingleLinkListElem(SingleLinkList l,int i,ElemType &e);//取链表中的第i个元素
status InsertSingleLinkList(SingleLinkList &l,int i,ElemType e);//在链表的第i个位置插入元素
status DeleteSingleLinkList(SingleLinkList &l,int i);//删除链表的第i个元素
void PrintSingleLinkList(SingleLinkList l);//打印链表
//初始化操作
status InitSingleLinkList(SingleLinkList &l)
{
//生成一个SingleLinkNode型的头结点,同时将该结点的起始位置赋给指针变量l
l=(SingleLinkList)malloc(sizeof(SingleLinkNode));
l->next=NULL;
if(l) //如果分配成功,设置节点
{
SingleLinkList p;
p=(SingleLinkList)malloc(sizeof(SingleLinkNode));
cout<<"请输入第一个元素值:";
cin>>p->data;
l->next=p;
p->next=NULL;
cout<<"初始化分配成功!"<<endl;
return 1;
}
else
{
cout<<"分配失败!"<<endl;
return 0;
}
}
//链表长度
int SingleLinkListLength(SingleLinkList l)
{
SingleLinkList p;
int i=0;
p=l->next;
if(l==NULL)
{
cout<<"该链表长度为零!"<<endl;
return 0;
}
while(p)
{
i++;
p=p->next;
}
return i;
}
//链表销毁操作
void DestroySingleLinkList(SingleLinkList &l)
{
if(l) //首先链表存在
{
SingleLinkList p;
while(l) //销毁是先销毁链表的头,再一个一个销毁后面
{
p=l->next;
free(l);
l=p;
}
if(!l)
{
cout<<"链表已销毁!"<<endl;
}
else
{
cout<<"链表未被销毁!"<<endl;
}
}
else
{
cout<<"链表不存在,无法进行链表销毁操作!"<<endl;
}
}
//链表清除操作
void ClearSingleLinkList(SingleLinkList &l)
{
if(l) //首先链表存在
{
SingleLinkList p=l->next,q;
while(p)
{
q=p->next;
free(p);
p=q;
}
l->next=NULL;
cout<<"清空操作完成!"<<endl;
}
else
{
cout<<"链表不存在,无法进行链表清空操作!"<<endl;
}
}
//链表是否为空
bool SingleLinkListEmpty(SingleLinkList l)
{
if(l->next==NULL)
{
cout<<"链表为空!"<<endl;
return 0;
}
else
{
cout<<"链表不为空!"<<endl;
return 1;
}
}
//取链表中的第i个元素
status GetSingleLinkListElem(SingleLinkList l,int i,ElemType &e)
{
int k=0;
SingleLinkList p=l->next;
if(i<1||i>SingleLinkListLength(l)) //判断不在链表的规定位置以内
{
cout<<"该链表不存在该位置!"<<endl;
return 0;
}
while(p&&k<i-1)
{
k++;
p=p->next;
}
e=p->data;
cout<<"存在第"<<i<<"个元素的值为:"<<e<<endl;
return 1;
}
//在链表的第i个位置插入元素
status InsertSingleLinkList(SingleLinkList &l,int i,ElemType e)
{
int k=0;
SingleLinkList p,q;
if(SingleLinkListLength(l)==0)
{
InitSingleLinkList(l);
}
p=l;
//1,寻找第i个结点
if(i<1||i>SingleLinkListLength(l)+1) //不能在第0位和length+1的位置插入
{
cout<<"插入位置不允许!所以"<<e<<"插入不成功"<<endl;
return 0;
}
while(p->next && k<i-1)
{
k++;
p=p->next;
}
//2,构造结点
if(!(q=(SingleLinkList)malloc(sizeof(SingleLinkNode))))
{
cout<<"构造结点不成功!"<<endl;
return 0;
}
//3,设置结点并将结点链入
q->data =e;
q->next =p->next;
p->next =q;
cout<<"插入"<<e<<"成功!"<<endl;
return 1;
}
//删除链表的第i个元素
status DeleteSingleLinkList(SingleLinkList &l,int i)
{
int k=1; //注意k值
SingleLinkList p=l->next,q;
if(i<1||i>SingleLinkListLength(l))
{
cout<<"删除位置不正确!"<<endl;
return 0;
}
//1,寻找第i-1个结点
if(i>1)
{
while(p && k<i-1)
{
k++;
p=p->next;
}
q=p->next;
p->next =q->next ;
free(q);
cout<<"删除第"<<i<<"个元素成功!"<<endl;
return 1;
}
else
{
q=p->next;
l->next=q;
free(p);
cout<<"删除第"<<i<<"个元素成功!"<<endl;
return 1;
}
}
//打印链表
void PrintSingleLinkList(SingleLinkList l)
{
SingleLinkList p=l->next;
while(p)
{
cout<<p->data<<",";
p=p->next;
}
cout<<endl;
}
源文件:
#include"SingleLinkList.h"
void main()
{
SingleLinkList M;
ElemType e;
InitSingleLinkList(M); //初始化
SingleLinkListEmpty(M);
InsertSingleLinkList(M,1,20); // 插入
InsertSingleLinkList(M,1,25); // 插入
InsertSingleLinkList(M,1,2); // 插入
InsertSingleLinkList(M,1,11);// 插入
InsertSingleLinkList(M,1,19);// 插入
InsertSingleLinkList(M,1,8);// 插入
InsertSingleLinkList(M,10,66);// 插入失败
PrintSingleLinkList(M); // 输出链表
GetSingleLinkListElem(M,6,e); // 得到元素
GetSingleLinkListElem(M,0,e); // 得到错误位置元素
DeleteSingleLinkList(M,10);// 删除错误位置元素
DeleteSingleLinkList(M,1);// 删除元素
cout<<"删除后的链表为:";
PrintSingleLinkList(M); // 输出链表
SingleLinkListEmpty(M); // 链表是否为空
ClearSingleLinkList(M);// 清空链表
SingleLinkListEmpty(M); // 链表是否为空
DestroySingleLinkList(M);// 销毁链表
cout<<endl;
}
效果截图: