实验内容 :
1、己知带头结点的动态单链表L中的结点是按整数值递增排序的,试写一算法将值为×
的结点插入到表L中,使工仍然有序。要求算法的时间复杂度为O(n),空间复杂度为0(1)。
2、设计一算法,逆置带头结点的动态链表L。要求利用原表的结点空间,并要求用尽可
能少的时间完成。
3、假设有两个按元素值递增有序的线性表A和B,均以单链表作存储结构,试编写算法 将A表和B表归并成一个按元素值递减有序的线性表性表C,并要求利用原表的空间存放C,
并要求用尽可能少的时间完成
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int Status;
int n;
int m;
int q;
typedef struct LNode {
int date;
struct LNode* next;
}LNode, * LinkList;
//构建一个空表
Status InitList(LinkList& L)
{
L = new LNode;
L->next = NULL;
return OK;
}
//创建单链表
void CreatList(LinkList& L, int n)//头插
{
for (int i = 0; i < n; i++)
{
LinkList p;
p = new LNode;
cin >> p->date;
p->next = L->next;
L->next = p;
}
}
void CreatList1(LinkList& L, int n)
{
LNode* r;
r = L;
for (int i = 0; i < n; i++)
{
LinkList p;
p = new LNode;
cin >> p->date;
p->next = NULL;
r->next = p;
r = p;
}
}
void swapNode(LNode* a, LNode* b)
{
int temp = a->date;
a->date = b->date;
b->date = temp;
}
void display(LinkList& L)
{
LNode* p;
p = L->next;
while (p->next)
{
cout << p->date << " ";
p = p->next;
}
cout << p->date;
}
void subSort(LNode* low, LNode* high)
{
if (low == NULL || low->next == NULL || low == high)return;
int pivot = low->date;
LNode* i = low->next;
LNode* i_pre = low;
LNode* j = low->next;
while (j != high->next)
{
if (j->date < pivot)
{
swapNode(i, j);
i_pre = i;
i = i->next;
}
j = j->next;
}
swapNode(low, i_pre);
subSort(low, i_pre);
subSort(i, high);
}
void quickSortList(LinkList& L)
{
LNode* cur = L;
while (cur->next != NULL)
{
cur = cur->next;
}
subSort(L, cur);
}
void subSort2(LNode* low, LNode* high)
{
if (low == NULL || low->next == NULL || low == high)return;
int pivot = low->date;
LNode* i = low->next;
LNode* i_pre = low;
LNode* j = low->next;
while (j != high->next)
{
if (j->date >= pivot)
{
swapNode(i, j);
i_pre = i;
i = i->next;
}
j = j->next;
}
swapNode(low, i_pre);
subSort2(low, i_pre);
subSort2(i, high);
}
void quickSortList2(LinkList& L)
{
LNode* cur = L;
while (cur->next != NULL)
{
cur = cur->next;
}
subSort2(L, cur);
}
void ListInsert(LinkList& L, int e)
{
LNode* p = new LNode;
LNode* r = L;
p->next = NULL;
p->date = e;
while (r->next)
{
r = r->next;
}
r->next = p;
quickSortList(L);
cout << "插入成功!";
}
void ListInsert1(LinkList& L, int e)
{
LNode* p = new LNode;
p->date = e;
p->next = L->next;
L->next = p;
quickSortList(L);
cout << "插入成功!";
}
void ConnectLink(LinkList& L1, LinkList& L2)
{
LinkList p1;
p1 = L1->next;
while (p1->next)
{
p1 = p1->next;
}
p1->next = L2->next;
}
void welcome()
{
cout << "1.初始化\n";
cout << "2.输入\n";
cout << "3.输出\n";
cout << "4.排序\n";
cout << "5.插入\n";
cout << "6.逆置\n";
cout << "7.连接\n";
cout << "0.退出\n";
cout << endl;
}
int main()
{
LinkList L;
L = new LNode;
L->next = NULL;
LinkList L1;
L1 = new LNode;
L1->next = NULL;
LinkList L2;
L2 = new LNode;
L2->next = NULL;
welcome();
int o1;
bool a = true;
while (a)
{
cout << endl << "请选择:";
cin >> o1;
switch (o1)
{
case 1:
InitList(L);
cout << "成功构建一个空的单链表!";
break;
case 2:
cout << "请输入链表长度!";
cin >> n;
cout << "请输入链表元素!";
CreatList1(L, n);
cout << "单链表创建成功!";
break;
case 3:
{
cout << "链表元素为:";
display(L);
break;
}
case 4:
{
quickSortList(L);
cout << "排序成功!";
break;
}
case 5:
{
int e;
cout << "请输入您要插入的元素! ";
cin >> e;
ListInsert(L, e);
break;
}
case 6:
{
quickSortList2(L->next);
cout << "逆置成功!";
break;
}
case 7:
{
cout << "请输入链表A长度!";
cin >> m;
cout << "请输入链表A元素!";
CreatList1(L1, m);
cout << "请输入链表B长度!";
cin >> q;
cout << "请输入链表B元素!";
CreatList1(L2, q);
ConnectLink(L1, L2);
cout << "连接成功! ";
quickSortList2(L1->next);
cout << "链表元素为:";
display(L1);
break;
}
case 0:
{
a = false;
}
}
}
return 0;
}