定义一个数据域为整数值的单链表,编程实现如下功能:
(1)设计一个CreatList函数,实现通过前插法创建一个有n个结点的单链表(带头结点);设计一个 PrintList函数,实现输出单链表的各个元素的值。要求:用main函数控制调用实现相关功能。
(2)修改(1)中的CreatList函数,实现通过后插法创建一个有n个结点的单链表。
(3)设计一个ListDelete函数,在前面所创建的单链表中删除第i个元素。
(4)设计一个inverse函数,将不带头结点的单链表“原地”逆转,即要求仅利用原表的存储空间。
(5)利用CreatList函数创建两个递增的用序单链表,再设计一个MergeList函数,将这两个递增的有序链表合并为一个递增的有序链表。
要求①结果链表仍使用原来两个链表的存储空间;②表中不允许有重复的数据。
实现效果:
不多bb,直接上代码:
#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode* next;
}LNode,*LinkList;
void CreatrList_H(LinkList &L, int n);//(1)前插法创建单链表
void CreateList_R(LinkList &L, int n);//(2)后插法创建单链表
bool ListDelete(LinkList &L, int i);//(3)链表删除
int InverseList(LinkList &L);//(4)逆转单链表
void MergeList(LinkList &La,LinkList &Lb, LinkList &Lc);//(5)有序表的合并
bool GetElem(LinkList L, int i,int &e);//取值
int LengthList(LinkList &L);//求单链表的长度
void PrintList(LinkList &L);//打印单链表
int main()
{
LinkList L;
int n;
cout << "====================" << endl << "(1).前插法创建单链表(在空链表上操作):" << endl << endl;
cout << "请输入要插入的个数:";
cin >> n;
cout << "请输入要插入的元素(以空格分隔):";
CreatrList_H(L, n);
cout << "当前链表长度为:" << L->data << endl;
cout << "当前链表元素为:";
PrintList(L);
cout << endl<<"====================" << endl << "(2).后插法创建单链表(在空链表上操作):" << endl << endl;
cout << "请输入要插入的个数:";
cin >> n;
cout << "请输入要插入的元素(以空格分隔):";;
CreateList_R(L, n);
cout << "当前链表长度为:" << L->data << endl;
cout << "当前链表元素为:";
PrintList(L);
cout << endl;
cout << endl<<"===================="<< endl<<"(3):请输入要删除的位置(在(2)中的链表上操作):" << endl;
int j2;
cin >> j2;
if (ListDelete(L, j2))
{
cout << "删除成功!" << endl;
}
else
{
cout << "删除位置不合法!" << endl;
}
cout << "当前链表元素为:";
for (int i = 1;i <= L->data;i++)
{
int e;
GetElem(L, i, e);
cout << e << " ";
}
cout << endl;
cout << endl<<"====================" << endl << "(4).逆转链表:" << endl << endl;
cout<<"请输入新的单链表的元素个数:"<<endl;
cin>>n;
cout<<"请输入新的单链表的元素(后插法):";
CreateList_R(L, n);
InverseList(L);//逆转
cout<<"逆转后的链表为:";
PrintList(L);
cout<<endl<<endl;
cout << endl<<"====================" << endl <<"(5)有序表的合并"<<endl<<endl;
cout<<"请用后插法依次输入两个递增的单链表La和Lb:"<<endl;
int n1,n2;
LinkList La,Lb,Lc;
cout<<"请输入第一个链表La的长度n1:";
cin>>n1;
cout<<"请输入第二个链表Lb的长度n2:";
cin>>n2;
cout<<"请依次输入链表La的元素(元素之间用空格分隔):";
CreateList_R(La, n1);
cout<<"请依次输入链表Lb的元素(元素之间用空格分隔):";
CreateList_R(Lb, n2);
int l=(LengthList(La)+LengthList(Lb));
cout<<"La与Lb合并后的链表为:" ;
MergeList(La,Lb,Lc);
for (int i = 1;i <=l;i++)
{
int e;
GetElem(Lc, i, e);
cout << e << " ";
}
cout<<endl;
system("pause");
return 0;
}
void CreatrList_H(LinkList &L, int n)
{//(1)头插法创建单链表
L = new LNode;
L->next = NULL;
L->data = 0;
for (int i = 0;i < n;i++)
{
int m;
LNode* p = new LNode;
cin >> m;
p->data= m;
p->next = L->next;
L->next = p;
L->data++;
}
}
void CreateList_R(LinkList &L, int n)
{//(2)尾插法创建单链表
L = new LNode;
L->data = 0;
L->next = NULL;
LNode* r = L;
for (int i = 0;i < n;i++)
{
int m;
LNode* p = new LNode;
cin >> m;
p->data=m;
p->next = NULL;
r->next = p;
r = p;
L->data++;
}
}
bool ListDelete(LinkList &L, int i)
{//(3)链表删除
LNode* p = L;
int j = 0;
while (p->next && j < i - 1)
{
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))
{
return false;
}
LNode* q=p->next;
p->next = q->next;
L->data--;
delete q;
return true;
}
int InverseList(LinkList &L)
{//(4)链表逆转
LinkList p = L->next;
L->next = NULL;
while(p)
{
LNode*q = p->next;//q指向*p的后继
p->next = L->next;
L->next = p;
p = q;
}
}
void MergeList(LinkList &La,LinkList &Lb, LinkList &Lc)
{//(5)有序链表的合并
LinkList pa = La->next; //pa和pb分别是链表La和Lb的工作指针,
LinkList pb = Lb->next; //分别初始化为相应链表的第一个结点
LinkList pc = La; //用La的头结点作为Lc的头结点
Lc = pc;
while (pa && pb)
{
if (pa->data < pb->data)
{
pc->next = pa;//将pa链接在pc后
pc = pa;
pa = pa->next;//pa指针后移
}
else if (pa->data > pb->data)
{//若Lb较小
pc->next = pb;//将pb链接在pc后
pc = pb;
pb = pb->next;//pb指针后移
}
else
{//若La==Lb
pc->next = pa;
pc = pa;
pa = pa->next;
LNode*q = pb->next;//接下来三行为删除Lb
delete pb;
pb = q;
}
}
pc->next = pa ? pa : pb; //插入剩余段
delete Lb; //释放Lb的头结点
}
int LengthList(LinkList &L)
{//求长度
int count = 0;
LinkList p;
p =L->next;
while(p)
{
count++;
p=p->next;
}
return count;
}
bool GetElem(LinkList L, int i,int &e)
{//取值(根据下标得到元素)
LNode*p = L->next;
int j = 1;
while (p&&j < i)
{
p = p->next;
j++;
}
if (!p || j > i)
{
return false;
}
e = p->data;
return true;
}
void PrintList(LinkList &L)
{//打印单链表
for (int i = 1;i <=L->data;i++)
{
int e;
GetElem(L, i, e);
cout << e << " ";
}
}