单链表
线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的)。
下面直接上代码实现(注:使用的是C++语言)
#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode, *LinkList; //*LinkList结构体类型指针
Status InitList(LinkList &L) //初始化
{
L=new LNode;//生成新的结点作为头结点,用头指针L指向头结点
L->next=NULL; //头结点的指针域置空
return OK;
}
void CreateList_H(LinkList &L) //头插法创建单链表
{
int n;
cout<<"请输入元数个数:"<<endl;
cin>>n;
cout<<"每个元素输入时请用空格隔开:"<<endl;
L=new LNode;
L->next =NULL; //先建立一个带头结点的空链表
LNode *p;
for (int i=0; i<n; ++i)
{
p=new LNode; //生成新的结点*p
cin>>p->data; //输入的元素值赋给新结点*p的数据域
p->next=L->next; //将新结点*p插入到头结点之后
L->next=p;
}
cout <<"链表创建完毕!!!"<<endl;
cout<<"当前的链表的元素为:";
p=L->next; //将指针p指回首元结点,才能正常输出
if (p==NULL) cout<<"链表为空!!!"<<endl;
while (p!=NULL)
{
cout <<p->data<<" ";
p=p->next;
}
cout<<endl;
}
Status ListInsert(LinkList &L)//单链表插入元素
{
int i,e;
cout<<"请输入插入元素的位置:"<<endl;
cin>>i;
cout<<"请输入插入的元素为:"<<endl;
cin>>e;
int j;
LNode *s,*p;
p=L;
j=0;
while (p && (j<i-1))//查找第i-1个结点,p指向结点
{
p=p->next;
j=j+1;
}
if (!p || (j>i-1)) //i>n+1或者i<1
{
cout<<"位置错误!!!"<<endl;
return ERROR;
}
s=new LNode; //生成新的结点*s
s->data=e; //将结点*s的数据域置为e
s->next=p->next; //将结点*s的指针域指向结点ai
p->next=s; //将结点*p的指针域指向结点*s
cout<<"元素插入成功!!!:"<<endl;
cout<<"当前的链表的元素为:";
p=L->next;
if (p==NULL) cout<<"链表为空!!!"<<endl;
while (p!=NULL)//输出部分
{
cout <<p->data<<" ";
p=p->next;
}
cout<<endl;
return OK;
}
Status ListDelete(LinkList &L)//单链表删除元素
{
int i;
cout<<"请输入删除的元素的位置:"<<endl;
cin>>i;
int j;
LNode *p,*q;
p=L; //将p指向头结点
j=0;
while ((p->next) && (j<i-1))//寻找要删除的位置
{
p=p->next;
++j;
}
if (!(p->next) || (j>i-1))//当i>n或i<1时删除位置不合理
{
cout<<"删除位置错误!!!"<<endl;
return ERROR;
}
q=p->next; //临时保存被删除结点的地址以备释放
p->next=q->next; //改变删除结点前驱结点的指针域
delete q; //释放删除结点的空间
cout<<"元素删除成功:"<<endl;
cout<<"当前的链表的元素为:";
p=L->next;
if (p==NULL) cout<<"链表为空!!!"<<endl;
while (p!=NULL)//又再输出
{
cout <<p->data<<" ";
p=p->next;
}
cout<<endl;
return OK;
}
//********************************功能实现函数**************************************//
//菜单
void menu()
{
cout<<"(************1.创建 2.插入************)"<<endl;
cout<<"(************3.删除 4.退出************)"<<endl;
}
因为代码比较长,所以用截图表示主函数部分了!
本文目的是供大家参考关于链表代码实现,这里大部分的代码在(《数据结构》严蔚敏 李冬梅 吴伟民 著有),同时也是记录自己实训的成长希望大家能有收获!Thank you !