上篇文章是线性表的顺序表示,本篇便是线性表的链式表示。
主函数的步骤包括,输入线性表数据,对链表的删除,插入。利用指针进行对链表的访问。
同时为了增加程序可读性,将结构体定义为LNode,*linklist。
#include<iostream>
//线性表的链式表示
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*linklist;//指向结构体的指针变量
int initlist(linklist &l)//初始化链表
{
l=new LNode;//新的头节点
l->next=NULL;
return 1;//成功初始化
}
int getelem(linklist l,int i,int &e)//链表的取值
{
LNode *p;
p=l->next;
int j=1;
while(p&&i<j)
{
p=p->next;
j++;
}
if(!p||i>=j) return 0;
e=p->data;
return 1;
}
int loateelem(linklist l,int e)//查找
{
linklist p;
int i;
p=l;
while(p)
{
p=p->next;
if (p->data==e)
return 1;
}
if(!p)
return 0;
}
int listinsert(linklist &l,int i,int e)//线性表的插入
{
linklist p,s;
s=new LNode;
int j=0;
p=l;
while(p&&j<(i-1))
{
p=p->next;
j++;
}
if(!p||j>(i-1)) return 0;
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
int listdelet(linklist &l,int i)//链表的删除
{
linklist p,q;
int j=0;
p=l;
while(p->next && j<(i-1))
{
p=p->next;
j++;
}
if(!(p->next)||j>(i-1)) return 0;
q=p->next;
p->next=p->next->next;
delete q;
return 1;
}
void creatlist(linklist &l,int n)//创建链表
{
l=new LNode;
linklist p;
l->next=NULL;
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=l->next;
l->next=p;
}
}
int main()
{
linklist l,p;
int n,i,j,k;
cin>>n;
initlist(l);//初始化链表
creatlist(l,n);//创建链表
p=l->next;//p指向首元节点
for(i=0;i<n;i++)
{
cout<<p->data<<" ";//输出节点的数据域
p=p->next;//p继续指向下一个节点
}
cout<<endl<<"删除的数据:";//删除链表数据
cin>>k;
if(listdelet(l,k))
{
cout<<"删除成功"<<endl;
p=l->next;
for(i=0;i<n-1;i++)
{
cout<<p->data<<" ";//输出节点的数据域
p=p->next;//p继续指向下一个节点
}
}
else cout<<"删除失败"<<endl;
cout<<endl<<"输入插入的位置与数值:";//插入数据
cin>>j>>k;
if(listinsert(l,j,k));
{
cout<<"插入成功"<<endl;
p=l->next;//p指向首元节点
for(i=0;i<n;i++)
{
cout<<p->data<<" ";//输出节点的数据域
p=p->next;//p继续指向下一个节点
}
}
if(!listinsert(l,j,k)) cout<<"插入失败"<<endl;
return 0;
}