数据结构 实验二

实验内容 :

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值