IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构实验报告——两个有序线性表的归并算法 -> 正文阅读

[数据结构与算法]数据结构实验报告——两个有序线性表的归并算法

一、实验内容及要求:

1.从键盘输入数据,建立两个有序线性表(每个线性表的输入数据按由小到大次序输入来建立线性表,不必考虑排序算法);输出建好的这两个有序线性表;将这两个有序线性表归并为一个有序线性表;输出归并后的有序线性表。

2.从键盘实现数据输入与输出的格式自拟;要求完成两个同样功能的程序,一个程序采用顺序存储结构,另一个程序采用链表实现线性表的存储。其中链表实现时,要求利用两个升序链表的结点实现归并,即归并时不能新建结点,归并后原来两个升序链表的存储空间不在存在。

二、主要说明

1.数据结构设计简要描述:

顺序存储结构使用结构体,结构体中带有数组以及数组的最大存储空间。

链式存储结构同样使用结构体定义结点,用带附加头结点单向链表,每个结点包括整型或浮型类型的数据域和一个指针域。

2.算法设计简要描述:

????顺序与链式两种存储均为依次互相比较两线性表中值的大小。顺序存储是新申请存储空间将数据依次存入静态数组中,链式存储是利用原有空间将结点按照数据大小进行重新连接。

第一个程序是通过动态分配内存,初始化两个线性表,然后通过两表相同索引之间值的比较,将其重新赋给新建立的第三个表从而实现两表的合并;

第二个程序是通过建立表头,设置循环分别建立两个链表,然后通过两表中data数值的比较,使第三个表等于第一个表,排序后全部插入第一个表,最后释放第二个表,从而实现量表的合并。

3.输入/输出设计简要描述:

第一个程序从键盘以从小到大的顺序输入以空格(或CR或TAB)分隔的若干不等于0的整数,直到输入0时停止输入,按整数输入次序建立结点并顺序连接结点。

第二个程序从键盘乱序输入以空格(或CR或TAB)分隔的若干不等于0的整数,直到输入0时停止输入,按排序后整数输入次序建立结点并顺序连接结点。

4.编程语言说明:

??编程平台:Visual Stdio 2019。编程语言:c语言。 ???

5.主要函数说明:

第一个程序:首先通过InitList函数为线性表动态分配空间,然后通过Input为线性表赋值,初始化好后通过MergeList函数合并两线性表,最后通过Output函数输出线性表。

???第二个程序:首先通过CreateList函数在动态创建表头的同时依次指向下一个节点并赋值,再用函数SortList给输入的数排序,然后通过MergeList合并两线性表,最后用OutputList输出线性表。

三、源程序代码

程序一:

运行示例:

程序源码:

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
typedef struct {
	int *elem;
	int length;
	int listsize;
}SqList;
void InitList(SqList &L) {
	L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
	if (!L.elem) exit(1);
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
}
void Input(SqList& L) {
	int x;
	while (1) {
		scanf_s("%d", &x);
		if (x == 0 || L.length >= LIST_INIT_SIZE) break;
		L.elem[L.length++] = x;
	}
}
void Output(SqList &L) {
	for (int i = 0; i < L.length; i++) {
		printf("%3d", L.elem[i]);
	}
}
void MergeList(SqList &La, SqList &Lb, SqList &Lc) {
	int i = 0, j = 0, k = 0;
	Lc.length = La.length + Lb.length;
	while (i < La.length && j < Lb.length) {
		if (La.elem[i] < Lb.elem[j]) {
			Lc.elem[k] = La.elem[i];
			i++;
		}
		else {
			Lc.elem[k] = Lb.elem[j];
			j++;
		}
		k++;
	}
	while (k < Lc.length) {
		if (i == La.length) {
			Lc.elem[k] = Lb.elem[j];
			j++;
		}
		else {
			Lc.elem[k] = La.elem[i];
			i++;
		}
		k++;
	}
}

int main()
{
	SqList a, b, c;
	InitList(a);
	InitList(b);
	InitList(c);
	printf("输入第一个线性表数据:");
	Input(a);
	printf("输入第二个线性表数据:");
	Input(b);
	printf("第一个有序线性表:");
	Output(a);
	printf("\n");
	printf("第二个有序线性表:");
	Output(b);
	printf("\n");
	MergeList(a, b, c);
	printf("归并后的有序线性表:");
	Output(c);
}

程序二:

运行示例:

?程序源码:

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
typedef struct LNode {
	int data;
	struct LNode* next;
}LNode,*LinkList;
LinkList CreatList() {
	LinkList head, tail,p;
	int e;
	head = (LinkList )malloc(sizeof(LNode)*LIST_INIT_SIZE);
	tail = head;
	scanf_s("%d", &e);
	while (e) {
		p = (LinkList )malloc(sizeof(LNode) * LIST_INIT_SIZE);
		p->data = e;
		tail->next = p;
		tail = p;
		scanf_s("%d", &e);
	}
	tail->next = NULL;
	return head;
}
void OutputList(LinkList L) {
	LinkList p = L->next;
	while (p) {
		printf("%3d", p->data);
		p = p->next;
	}
}
void SortList(LinkList L) {
	LinkList p, q;
	int temp;
	for(p=L;p!=NULL;p=p->next)
		for (q = p->next; q != NULL; q = q->next)
		{
			if (p->data >q->data) {
				temp = p->data;
				p->data = q->data;
				q->data = temp;
			}
		}
}
void MergeList(LinkList La, LinkList Lb) {
	LinkList pa, pb, pc;
	pa = La->next;
	pb = Lb->next;
	pc = La;
	free(Lb);
	while(pa && pb)
		if (pa->data <= pb->data) {
			pc->next = pa;
			pc = pa;
			pa = pa->next;
		}
		else {
			pc->next = pb;
			pc = pb;
			pb = pb->next;
		}
	if (pa) pc->next = pa;
	else pc->next = pb;
}
int main()
{
	LinkList La,Lb;
	printf("输入第一个链表:");
	La = CreatList();
	SortList(La);
	printf("输入第二个链表:");
	Lb = CreatList();
	SortList(Lb);
	printf("第一个排序后的链表:");
	OutputList(La);
	printf("\n");
	printf("第二个排序后的链表:");
	OutputList(Lb);
	MergeList(La, Lb);
	printf("\n");
	printf("归并后的链表:");
	OutputList(La);
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-20 12:44:30  更:2021-10-20 12:44:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:28:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码