当前位置:   article > 正文

数据结构实验报告——两个有序线性表的归并算法_数据结构实验顺序存储归并

数据结构实验顺序存储归并

一、实验内容及要求:

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输出线性表。

三、源程序代码

程序一:

运行示例:

程序源码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define LIST_INIT_SIZE 100
  4. typedef struct {
  5. int *elem;
  6. int length;
  7. int listsize;
  8. }SqList;
  9. void InitList(SqList &L) {
  10. L.elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
  11. if (!L.elem) exit(1);
  12. L.length = 0;
  13. L.listsize = LIST_INIT_SIZE;
  14. }
  15. void Input(SqList& L) {
  16. int x;
  17. while (1) {
  18. scanf_s("%d", &x);
  19. if (x == 0 || L.length >= LIST_INIT_SIZE) break;
  20. L.elem[L.length++] = x;
  21. }
  22. }
  23. void Output(SqList &L) {
  24. for (int i = 0; i < L.length; i++) {
  25. printf("%3d", L.elem[i]);
  26. }
  27. }
  28. void MergeList(SqList &La, SqList &Lb, SqList &Lc) {
  29. int i = 0, j = 0, k = 0;
  30. Lc.length = La.length + Lb.length;
  31. while (i < La.length && j < Lb.length) {
  32. if (La.elem[i] < Lb.elem[j]) {
  33. Lc.elem[k] = La.elem[i];
  34. i++;
  35. }
  36. else {
  37. Lc.elem[k] = Lb.elem[j];
  38. j++;
  39. }
  40. k++;
  41. }
  42. while (k < Lc.length) {
  43. if (i == La.length) {
  44. Lc.elem[k] = Lb.elem[j];
  45. j++;
  46. }
  47. else {
  48. Lc.elem[k] = La.elem[i];
  49. i++;
  50. }
  51. k++;
  52. }
  53. }
  54. int main()
  55. {
  56. SqList a, b, c;
  57. InitList(a);
  58. InitList(b);
  59. InitList(c);
  60. printf("输入第一个线性表数据:");
  61. Input(a);
  62. printf("输入第二个线性表数据:");
  63. Input(b);
  64. printf("第一个有序线性表:");
  65. Output(a);
  66. printf("\n");
  67. printf("第二个有序线性表:");
  68. Output(b);
  69. printf("\n");
  70. MergeList(a, b, c);
  71. printf("归并后的有序线性表:");
  72. Output(c);
  73. }

程序二:

运行示例:

 程序源码:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define LIST_INIT_SIZE 100
  4. typedef struct LNode {
  5. int data;
  6. struct LNode* next;
  7. }LNode,*LinkList;
  8. LinkList CreatList() {
  9. LinkList head, tail,p;
  10. int e;
  11. head = (LinkList )malloc(sizeof(LNode)*LIST_INIT_SIZE);
  12. tail = head;
  13. scanf_s("%d", &e);
  14. while (e) {
  15. p = (LinkList )malloc(sizeof(LNode) * LIST_INIT_SIZE);
  16. p->data = e;
  17. tail->next = p;
  18. tail = p;
  19. scanf_s("%d", &e);
  20. }
  21. tail->next = NULL;
  22. return head;
  23. }
  24. void OutputList(LinkList L) {
  25. LinkList p = L->next;
  26. while (p) {
  27. printf("%3d", p->data);
  28. p = p->next;
  29. }
  30. }
  31. void SortList(LinkList L) {
  32. LinkList p, q;
  33. int temp;
  34. for(p=L;p!=NULL;p=p->next)
  35. for (q = p->next; q != NULL; q = q->next)
  36. {
  37. if (p->data >q->data) {
  38. temp = p->data;
  39. p->data = q->data;
  40. q->data = temp;
  41. }
  42. }
  43. }
  44. void MergeList(LinkList La, LinkList Lb) {
  45. LinkList pa, pb, pc;
  46. pa = La->next;
  47. pb = Lb->next;
  48. pc = La;
  49. free(Lb);
  50. while(pa && pb)
  51. if (pa->data <= pb->data) {
  52. pc->next = pa;
  53. pc = pa;
  54. pa = pa->next;
  55. }
  56. else {
  57. pc->next = pb;
  58. pc = pb;
  59. pb = pb->next;
  60. }
  61. if (pa) pc->next = pa;
  62. else pc->next = pb;
  63. }
  64. int main()
  65. {
  66. LinkList La,Lb;
  67. printf("输入第一个链表:");
  68. La = CreatList();
  69. SortList(La);
  70. printf("输入第二个链表:");
  71. Lb = CreatList();
  72. SortList(Lb);
  73. printf("第一个排序后的链表:");
  74. OutputList(La);
  75. printf("\n");
  76. printf("第二个排序后的链表:");
  77. OutputList(Lb);
  78. MergeList(La, Lb);
  79. printf("\n");
  80. printf("归并后的链表:");
  81. OutputList(La);
  82. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/674229
推荐阅读
相关标签
  

闽ICP备14008679号