上一个博客介绍了线性表顺序存储时基本操作的实现和顺序有序表的合并,现在我们来实现线性表的链式存储。
我认为比较重要的部分就是,单链表插入数据和删除数据的实现,下面是这两个功能的图解:
所有代码:
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct LNode
{
int data; //结点的数据域
struct LNode *next; //结点的指针域
}LNode,*List; //List为指向结构体LNode的指针类型
void InitList(List &L) //创建链表
{
L = (List)malloc(sizeof(LNode));
L->next = NULL;
}
void ListInput(List &L,int n) //链表数据的输入
{
//头插法 ,倒序输入
/* cout << "请输入各个数据:" << endl;
for(int i=0;i<n;++i)
{
List p;
InitList(p);
p->next = L->next;
L->next = p;
cin >> p->data;
} */
//尾插法 ,正序输入
cout << "请输入各个数据:" << endl;
List q;
q = L;
for(int i=0;i<n;++i)
{
List p;
InitList(p);
q->next = p;
q = q->next;
cin >> p->data;
}
}
bool LocateElem(List L,int e) //判断List里有没有e这个元素
{
while(L->next!=NULL)
{
L = L->next;
if(L->data==e)
return true;
}
return false;
}
void ListInsert(List &L,int e) //将e插入到List中
{
int i=0,n;
cout << "请输入要插入的位置:" << endl;
cin >> n;
List p,s;
InitList(p);
InitList(s);
p = L;
while(L&&i<n-1)
{
p = p->next;
}
if(!L||i>n-1)
{
cout << "插入失败!" << endl;
}
else
{
s->data = e;
s->next = p->next;
p->next = s;
}
}
void delete_e(List &L,int i) //链表第i个元素的删除
{
List p,q;
p = L;
int j=0;
while(p->next&&j<i-1)
{
p = p->next;
++j;
}
q = p->next;
p->next = q->next;
free(q);
}
void ListOutput(List L) //输出List
{
while(L->next!=NULL)
{
L = L->next;
cout << L->data << " ";
}
cout << endl;
}
void deleteList(List &L) //链表的销毁
{
List p;
p = L;
while(p)
{
L= L->next;
free(p);
p = L;
}
cout << "销毁成功!" << endl;
}
void unionList(List &LA,List LB) //算法2.14 线性表的合并(链表)
{
//将所有在线性表LB中但不在LA中的数据元素插入到LA中
List pa, pb, p ,q;
p = LA;
pa = LA->next;
pb = LB->next;
while(pa&&pb)
{
if(pa->data > pb->data)
{
q = pb;
pb = pb->next;
p->next = q;
p = q;
q->next = pa;
}
else
{
p = pa;
pa = pa->next;
}
}
while(pa&&!pb)//如果pb为空
{
p->next = pa;
p = p->next;
pa = pa->next;
}
while(!pa&&pb)//如果pa为空
{
q = pb;
p->next = q;
pb = pb->next;
p = q;
}
cout << "合并完毕!" << endl;
} //unionList
int main()
{
List LA,LB,L;
int n,m,L_n,choose,e,x=0,i;
cout << "1.数据链表的创建" << endl;
cout << "2.数据的输入" << endl;
cout << "3.判断数据e是否存在" << endl;
cout << "4.插入数据e" << endl;
cout << "5.删除链表第i个元素" << endl;
cout << "6.两个数据链表的合并" <<endl;
cout << "7.数据链表的输出" << endl;
cout << "8.数据链表的销毁,并退出程序" << endl;
while(x==0)
{
cout << "请选择:";
cin >> choose;
switch(choose)
{
case 1:
InitList(L);
cout << "创建成功!" << endl;
break;
case 2:
cout << "请输入线性表元素的个数:";
cin >> L_n;
ListInput(L,L_n);
cout << "输入成功!" << endl;
break;
case 3:
cout << "请输入要查询的数据e:";
cin >> e;
if(LocateElem(L,e))
cout << "线性表L中存在数据" << e << endl;
else
cout << "线性表L中不存在数据" << e << endl;
break;
case 4:
cout << "请输入要插入的数据:";
cin >> e;
ListInsert(L,e);
break;
case 5:
cout << "请输入i的值" << endl;
cin >> i;
delete_e(L,i);
break;
case 6:
InitList(LA);
InitList(LB);
cout<<"请输入线性表LA的元素个数:";
cin>>n;
ListInput(LA,n);
cout<<"请输入线性表LB的元素个数:";
cin>>m;
ListInput(LB,m);
unionList(LA,LB);
cout<<"LA和LB合并后的集合为:\n";
ListOutput(LA);
break;
case 7:
ListOutput(L);
break;
case 8:
deleteList(L);
x = 1;
break;
}
}
return 0;
}