实验报告03-两个有序链表的合并

合集下载

数据结构单链表实验报告

数据结构单链表实验报告

数据结构单链表实验报告实验目的:掌握单链表的基本操作,学会使用单链表实现各种算法。

实验内容:实现单链表的基本操作,包括创建、插入、删除、访问等。

利用单链表完成以下算法:- 单链表逆序- 查找单链表中的中间节点- 删除单链表中的倒数第K个节点- 合并两个有序单链表为一个有序单链表实验步骤:1. 创建单链表在创建单链表时,先定义一个结构体Node来表示链表中的节点,节点包括数据域和指针域,指针域指向下一个节点。

然后,用指针p指向链表的头节点,将头节点的指针域初始化为NULL。

2. 插入节点在单链表中插入节点的操作分为两种情况:- 在链表头插入节点- 在链表中间或尾部插入节点无论是哪种情况,先将新节点的指针域指向要插入的位置的下一个节点,再将要插入的位置的指针域指向新节点即可。

3. 删除节点删除链表节点的操作同样分为两种情况:- 删除头节点- 删除中间或尾部节点要删除头节点,先用一个指针将头节点指向的下一个节点保存起来,再将头节点释放掉。

要删除中间或尾部节点,先用一个指针指向要删除节点的前一个节点,然后将指向要删除节点的前一个节点的指针域指向要删除节点的下一个节点,最后将要删除的节点释放掉。

4. 单链表逆序单链表逆序可以使用三个指针来完成,分别为pre指针、cur指针和next指针。

首先将pre指针和cur指针指向NULL,然后循环遍历链表,将cur指针指向当前节点,将next指针指向当前节点的下一个节点,然后将当前节点的指针域指向pre指针,最后将pre指针和cur指针向前移动一个节点,继续进行循环。

5. 查找单链表中的中间节点查找单链表中的中间节点可以使用双指针法,将两个指针p1和p2都指向链表头,然后p1每次向前移动一个节点,而p2每次向前移动两个节点,当p2指向了链表尾部时,p1指向的节点即为中间节点。

6. 删除单链表中的倒数第K个节点删除单链表中的倒数第K个节点可以使用双指针法,在链表中定义两个指针p1和p2,p1指向链表头,p2指向第K个节点,然后p1和p2同时向前移动,直到p2指向链表尾部,此时p1指向的节点即为要删除的节点。

设计两个有序单链表的合并排序算法

设计两个有序单链表的合并排序算法

设计两个有序单链表的合并排序算法有序单链表的合并排序,是一种高效的排序算法,可以在较短的时间内对大量数据进行排序。

这种排序算法的核心在于将两个有序的单链表合并成一个有序的单链表,然后再对整个链表进行排序。

合并排序算法的基本原理是分治法。

将需要排序的数组不断地分解成两个子数组,直到每个子数组只包含一个元素为止。

然后再将这些子数组两两合并,直到整个数组被合并成一个有序的数组为止。

这里介绍两个有序单链表的合并排序算法,它们分别是迭代算法和递归算法。

1. 迭代算法迭代算法是一种通用的算法,它的思路是利用循环结构来重复执行一段相同或相似的代码,从而解决一类问题。

对于有序单链表的合并排序,迭代算法的基本思路是将两个有序单链表的元素依次比较,然后将较小的元素加入到新的链表中,直到两个链表中的元素全部被加入到新链表中为止。

以下是迭代算法的具体实现过程:```// 合并两个有序单链表Node* mergeList(Node* head1, Node* head2) { // 新建一个头结点Node* dummy = new Node(-1);// 定义两个指针,分别指向两个链表的头结点 Node* p = head1;Node* q = head2;// 定义一个指针,指向新链表的最后一个节点 Node* curr = dummy;// 循环比较两个链表中的元素while (p != nullptr && q != nullptr) {if (p->val <= q->val) {curr->next = p;p = p->next;} else {curr->next = q;q = q->next;}curr = curr->next;}// 将剩余的元素加入到新链表中curr->next = p != nullptr ? p : q;// 返回新链表的头结点return dummy->next;}// 归并排序Node* mergeSort(Node* head) {if (head == nullptr || head->next == nullptr) {return head;}// 定义两个指针,一个快指针每次走两步,一个慢指针每次走一步 Node* slow = head;Node* fast = head->next;while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;}// 将链表分成两部分Node* head1 = head;Node* head2 = slow->next;slow->next = nullptr;// 分别对两部分链表进行归并排序head1 = mergeSort(head1);head2 = mergeSort(head2);// 合并两个有序单链表return mergeList(head1, head2);}```2. 递归算法递归算法的思想是将一个大问题分解成若干个小问题,然后逐个解决这些小问题,最终得到大问题的解决方案。

有序链表的合并实验总结

有序链表的合并实验总结

有序链表的合并实验总结有序链表的合并是计算机科学中常见的操作之一,它在许多算法和数据结构中都有广泛的应用。

本文将对有序链表的合并进行实验总结,并探讨其应用和实现方法。

我们需要了解什么是有序链表。

有序链表是一种数据结构,它按照某种规则将元素按顺序排列在链表中。

在有序链表中,每个节点都包含一个值和一个指向下一个节点的指针。

这种数据结构的优点是插入和删除操作相对容易,但查找操作的效率较低。

因此,在某些场景下,有序链表比其他数据结构更适合。

有序链表的合并就是将两个有序链表合并成一个新的有序链表。

合并的过程是将两个链表中的节点逐个比较,并按照大小顺序插入到新链表中。

具体步骤如下:1. 创建一个新链表和两个指针,分别指向两个待合并的链表的头节点。

2. 比较两个指针所指节点的值的大小,将较小的节点插入到新链表中,并将指针向后移动一位。

3. 重复步骤2,直到有一个链表的指针为空。

4. 将另一个链表剩余的节点直接插入到新链表的末尾。

在实验过程中,我们可以编写一个简单的函数来实现有序链表的合并。

以下是一个示例代码:```pythonclass ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef mergeTwoLists(l1, l2):dummy = ListNode(0) # 创建一个虚拟节点作为新链表的头节点curr = dummy # 创建一个指针指向新链表的当前位置while l1 and l2:if l1.val < l2.val:curr.next = l1l1 = l1.nextelse:curr.next = l2l2 = l2.nextcurr = curr.next# 将剩余的节点直接插入到新链表的末尾if l1:curr.next = l1if l2:curr.next = l2return dummy.next # 返回新链表的头节点```通过上述代码,我们可以在O(n)的时间复杂度内完成两个有序链表的合并,其中n为两个链表的总长度。

循环链表的合并

循环链表的合并

循环链表的合并循环链表是一种特殊的链表结构,它的最后一个节点指向第一个节点,形成一个环状结构。

在循环链表中,每个节点都包含一个指向下一个节点的指针。

合并两个循环链表意味着将两个循环链表连接起来,形成一个新的循环链表。

合并两个循环链表的过程可以分为以下几个步骤:1. 首先,判断两个循环链表是否为空。

若其中一个链表为空,则直接返回另一个链表作为合并后的链表。

2. 接下来,找到第一个链表的最后一个节点和第二个链表的第一个节点。

将第一个链表的最后一个节点的指针指向第二个链表的第一个节点,同时将第二个链表的最后一个节点的指针指向第一个链表的第一个节点。

3. 最后,返回第一个链表的第一个节点作为合并后的循环链表的起始节点。

下面我们通过一个具体的例子来说明合并两个循环链表的过程:假设有两个循环链表A和B,它们分别包含如下节点:链表A:1 -> 2 -> 3 -> 4 -> 1链表B:5 -> 6 -> 7 -> 5判断链表A和链表B是否为空。

由于两个链表都不为空,我们继续执行下一步。

然后,找到链表A的最后一个节点4和链表B的第一个节点5。

将节点4的指针指向节点5,同时将节点7的指针指向节点1。

返回链表A的第一个节点1作为合并后的循环链表的起始节点。

合并后的循环链表为:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 1通过上述的例子,我们可以看出,合并两个循环链表的过程并不复杂。

只需要找到两个链表的相应节点,并修改它们之间的指针关系即可。

在实际应用中,合并循环链表的操作可以用于将两个有序的循环链表合并成一个有序的循环链表。

这种操作在某些场景下非常有用,比如合并两个有序的链表可以用于合并两个有序数组,从而形成一个更大的有序数组。

总结起来,合并循环链表的过程简单明了。

通过找到两个链表的相应节点,并修改它们之间的指针关系,我们可以将两个循环链表合并成一个新的循环链表。

算法分析与设计实验报告合并排序快速排序

算法分析与设计实验报告合并排序快速排序

算法分析与设计实验报告:合并排序与快速排序一、引言算法是计算机科学中非常重要的一部分,它涉及到解决问题的方法和步骤。

合并排序和快速排序是两种经典而常用的排序算法。

本文将对这两种排序算法进行分析和设计实验,通过对比它们的性能和效率,以期得出最优算法。

二、合并排序合并排序是一种分治算法,它将原始数组不断分解为更小的数组,直到最后细分为单个元素。

然后,再将这些单个元素两两合并,形成一个有序数组。

合并排序的核心操作是合并两个有序的数组。

1. 算法步骤(1)将原始数组分解为更小的子数组,直到每个子数组只有一个元素;(2)两两合并相邻的子数组,同时进行排序,生成新的有序数组;(3)重复步骤(2),直到生成最终的有序数组。

2. 算法性能合并排序的最优时间复杂度为O(nlogn),其中n为待排序数组的长度。

无论最好情况还是最坏情况,合并排序的复杂度都相同。

合并排序需要额外的存储空间来存储临时数组,所以空间复杂度为O(n)。

三、快速排序快速排序也是一种分治算法,它将原始数组根据一个主元(pivot)分成两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元。

然后,递归地对这两个子数组进行排序,最后得到有序数组。

快速排序的核心操作是划分。

1. 算法步骤(1)选择一个主元(pivot),可以是随机选择或者固定选择第一个元素;(2)将原始数组根据主元划分为两个子数组,一个子数组的元素都小于主元,另一个子数组的元素都大于主元;(3)递归地对这两个子数组进行快速排序;(4)重复步骤(2)和(3),直到每个子数组只有一个元素,即得到最终的有序数组。

2. 算法性能快速排序的平均时间复杂度为O(nlogn),其中n为待排序数组的长度。

最坏情况下,当每次选择的主元都是最小或最大元素时,时间复杂度为O(n^2)。

快速排序是原地排序,不需要额外的存储空间,所以空间复杂度为O(1)。

四、实验设计为了验证合并排序和快速排序的性能和效率,我们设计以下实验:1. 实验目的:比较合并排序和快速排序的时间复杂度和空间复杂度。

将两个有序顺序表合并成一个新的有序顺序表

将两个有序顺序表合并成一个新的有序顺序表

将两个有序顺序表合并成⼀个新的有序顺序表#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define MaxSize 50typedef struct{int data[MaxSize];int length;}SqList;void ListInsert(SqList *L,int i,int e){int j;if(i<1||i>L->length+1)exit(-1);if(L->length>=MaxSize)exit(-1);for(j=L->length;j>=i;j--)L->data[j]=L->data[j-1];L->data[i-1]=e;L->length++;}void DispList(SqList *L){int i;for(i=0;i<L->length;i++)printf("%d ",L->data[i]);printf("\n");}void Exchange(SqList *A,SqList *B,SqList *C){int i=0,j=0,k=0;while(i<A->length&&j<B->length){if(A->data[i]<B->data[j])C->data[k++]=A->data[i++];else if(A->data[i]>B->data[j])C->data[k++]=B->data[j++];}while(i<A->length)C->data[k++]=A->data[i++];while(j<B->length)C->data[k++]=B->data[j++];C->length=k;}void main(){SqList *A,*B,*C;A=(SqList*)malloc(sizeof(SqList));A->length=0;B=(SqList*)malloc(sizeof(SqList));B->length=0;C=(SqList*)malloc(sizeof(SqList));C->length=0;ListInsert(A,1,1);ListInsert(A,2,3);ListInsert(A,3,5);ListInsert(A,4,7);ListInsert(A,5,9);ListInsert(B,1,2);ListInsert(B,2,4);ListInsert(B,3,6);ListInsert(B,4,8);ListInsert(B,5,10);ListInsert(B,6,12);Exchange(A,B,C);printf("顺序表A:");DispList(A);printf("顺序表B:");DispList(B);printf("顺序表C:");DispList(C);}。

数据结构实验两个有序顺序表的合并

南昌大学实验报告学生姓名:李木子学号:8000113146 专业班级:软工133 实验类型:□验证□综合□设计□创新实验日期:实验成绩:一、实验项目名称两个有序顺序表的结合二、实验目的顺序表的创建1.实现顺序表的追加2.实现顺序表的显示3.两顺序表的合并三、实验基本原理四、主要仪器设备及耗材电脑,VC6.0五、实验步骤/*******************************************//* 顺序表的创建 *//* 1.实现顺序表的追加 *//* 2.实现顺序表的显示 *//* 3.两顺序表的合并 *//*******************************************/#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100typedef int datatype;/************************************//* 顺序表结构体的定义 *//************************************/typedef struct{datatype a[MAXSIZE];int size;}sequence_list;/************************************//* 函数声明 *//************************************/void init(sequence_list *slt);void append(sequence_list *slt,datatype x);void display(sequence_list slt);int find(sequence_list slt ,datatype x);void dele(sequence_list *slt,datatype x);void sort(sequence_list *s);void combine( sequence_list *s1 ,sequence_list *s2 ,sequence_list *s3);/************************************//* 顺序表的初始化函数 *//************************************/void init(sequence_list *slt){slt->size=0;}/************************************//* 顺序表的追加函数 *//************************************/void append(sequence_list *slt,datatype x){if(slt->size==MAXSIZE){printf("\n顺序表是满的!");exit(1);}slt->a[slt->size]=x ;slt->size=slt->size+1;}/************************************/ /* 顺序表的显示函数 */ /************************************/ void display(sequence_list slt){int i;if(!slt.size){printf("\n顺序表为空");}else{for(i=0;i<slt.size;i++)printf("\n%d\n",slt.a[i]);}}/************************************/ /* 顺序表的查找函数 */ /* 返回所查数据的下标 */ /************************************/ int find(sequence_list slt ,datatype x) {int i=0;while(i<slt.size &&slt.a[i]!=x)i++;return(i<slt.size? i:-1);}/************************************/ /* 顺序表的删除函数 */ /************************************/ void dele(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i]=slt->a [i+1];slt->size--;}/************************************//* 顺序表的插入函数 *//************************************/ void insert(sequence_list *slt,datatype x) {int i=0;i=find(*slt,x);for(;i<slt->size-1;i++)slt->a[i+1]=slt->a [i];slt->size++;}/************************************//* 顺序表排序 *//************************************/ void sort(sequence_list *s){int i ;int j ;int temp ;for(i=0;i<s->size-1;i++){for(j=i+1;j<s->size;j++){if(s->a[i]>=s->a[j]){temp=s->a[i];s->a[i]=s->a[j];s->a[j]=temp;}}}}/************************************//* 两个有序顺序表连接函数 *//************************************/void combine( sequence_list *s1 , sequence_list *s2 , sequence_list *s3 ) {int i=0;int j=0;int k=0;while( i < s1->size && j < s2->size){if(s1->a[i]<=s2->a[j]){s3->a[k]=s1->a[i];i++;}else{s3->a[k]=s2->a[j];j++;}k++;}if(i==s1->size){while(j<s2->size){s3->a[k]=s2->a[j];k++;j++;}}if(j==s2->size){while(i<s1->size){s3->a[k]=s1->a[i];k++;}}s3->size=k;}/************************************/ /* 主函数 */ /************************************/ int main(){int i ;int j ;int x ;int n ;sequence_list list1 ;sequence_list list2 ;sequence_list list3 ;init(&list1);printf("第一个顺序表元素个数:\n");scanf("%d",&n);printf("第一个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list1.a[i]);list1.size++;}sort(&list1);printf("排序后\n");display(list1);init(&list2);printf("第二个顺序表元素个数:\n");scanf("%d",&n);printf("第二个顺序表输入:\n");for(i=0; i<n ; i++){scanf("%d",&list2.a[i]);list2.size++;}sort(&list2);printf("排序后\n");display(list2);init(&list3);combine(&list1 ,&list2 ,&list3);printf("表一与表二连接后:\n");display(list3);return0;}六、实验数据及处理结果七、思考讨论题或体会或对改进实验的认识八、参考资料[1]《数据结构(c语言版)(第三版)》,李云清,人民邮电出版社[2]《C语言程序设计》,苏小红,高等教育出版社教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

链表的反转与合并掌握链表反转和合并操作的实现

链表的反转与合并掌握链表反转和合并操作的实现链表是一种常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

链表的反转和合并是链表操作中常见且重要的操作,在很多编程问题中都有应用。

本文将介绍链表的反转和合并操作的实现方法。

一、链表的反转链表的反转是指将链表中节点的顺序反向排列。

例如,对于链表1→2→3→4→5,反转后的链表为5→4→3→2→1。

实现链表的反转有两种常见的方法:迭代法和递归法。

1. 迭代法迭代法的实现思路是,从链表头节点开始,依次遍历每个节点,将该节点的指针指向前一个节点。

具体步骤如下:1)定义三个指针:当前节点指针cur、前一个节点指针prev、下一个节点指针next。

2)遍历链表,将当前节点的指针指向前一个节点,然后更新prev、cur和next指针的位置。

3)重复上述步骤,直到遍历到链表末尾。

以下是迭代法的实现代码示例(使用Python语言):```pythondef reverse_list(head):prev = Nonecur = headwhile cur:next = cur.nextcur.next = prevprev = curcur = nextreturn prev```2. 递归法递归法的实现思路是,从链表的尾节点开始,依次反转每个节点。

具体步骤如下:1)递归地反转除最后一个节点外的链表。

2)将当前节点的指针指向前一个节点。

3)返回反转后的链表的头节点。

以下是递归法的实现代码示例(使用Python语言):```pythondef reverse_list(head):if not head or not head.next:return headnew_head = reverse_list(head.next)head.next.next = headhead.next = Nonereturn new_head```二、链表的合并链表的合并是指将两个有序链表按照一定的规则合并成一个有序链表。

c++手写算法,两个有序数组的合并

c++手写算法,两个有序数组的合并【最新版】目录1.概述2.合并有序数组的方法3.实现过程4.示例代码5.总结正文1.概述C++是一种通用的编程语言,其强大的功能和灵活性使其成为许多程序员的首选。

在 C++中,算法是编程的核心,而手写算法则是检验程序员编程能力的重要方式。

本篇文章将介绍如何手写算法来实现两个有序数组的合并。

2.合并有序数组的方法在实现两个有序数组的合并过程中,我们可以采用双指针法。

这种方法使用两个指针,分别指向两个数组的头部,然后比较两个指针所指向的元素,将较小的元素放入到合并后的数组中,同时将指向较小元素的指针向后移动一位。

这个过程一直重复,直到某一个数组被完全合并到另一个数组中。

3.实现过程下面是一个具体的实现过程。

首先,我们需要定义一个新的数组,用于存储合并后的元素。

然后,我们使用双指针法,分别指向两个有序数组的头部。

在每一次循环中,我们比较两个指针所指向的元素,将较小的元素放入到新数组中,然后将指向较小元素的指针向后移动一位。

这个过程一直重复,直到某一个数组被完全合并到另一个数组中。

4.示例代码下面是一个示例代码,用于演示如何手写算法来实现两个有序数组的合并。

```cpp#include <iostream>using namespace std;void merge(int arr1[], int arr2[], int i, int j, int n1, int n2) {int m[n1 + n2], k = 0;for (int p = 0; p < n1; p++) {if (arr1[p] < arr2[j]) {m[k++] = arr1[p];} else {m[k++] = arr2[j++];}}for (int p = n1; p < n1 + n2; p++) {m[k++] = arr2[p];}for (int p = 0; p < n1 + n2; p++) {arr1[p] = m[p];}}int main() {int arr1[] = {1, 3, 5, 7};int arr2[] = {2, 4, 6, 8};int n1 = sizeof(arr1) / sizeof(arr1[0]);int n2 = sizeof(arr2) / sizeof(arr2[0]);merge(arr1, arr2, 0, 0, n1, n2);for (int i = 0; i < n1 + n2; i++) {cout << arr1[i] << " ";}cout << endl;return 0;}```5.总结通过手写算法,我们可以实现两个有序数组的合并。

数据结构合并两个顺序表

数据结构合并两个顺序表合并两个顺序表是在数据结构中常见的操作之一,本文将介绍如何合并两个顺序表,并给出相应的算法实现。

顺序表是一种线性表的存储结构,它使用连续的存储空间存储元素,并按照顺序存放。

合并两个顺序表的意思是将两个顺序表中的元素按照一定的顺序合并到一个新的顺序表中。

假设有两个顺序表A和B,它们的长度分别为m和n。

要合并这两个顺序表,可以使用以下步骤:1. 创建一个新的顺序表C,用于存放合并后的结果。

2. 首先将顺序表A中的元素复制到顺序表C中,保持元素的顺序不变。

3. 然后将顺序表B中的元素依次插入到顺序表C中的合适位置。

插入的位置可以根据需要进行调整,可以选择插入到顺序表C的末尾,也可以选择按照某种规则插入。

4. 最后,顺序表C中的元素就是合并后的结果。

在实现合并两个顺序表的算法时,可以使用两个指针分别指向顺序表A和顺序表B的元素。

比较指针指向的元素大小,然后将较小的元素插入到顺序表C中,并将对应的指针向后移动一位。

重复这个过程,直到遍历完两个顺序表中的所有元素。

下面是一个具体的算法实现示例:```void merge(SeqList A, SeqList B, SeqList C) {int i = 0; // 指向顺序表A的指针int j = 0; // 指向顺序表B的指针int k = 0; // 指向顺序表C的指针// 将顺序表A中的元素复制到顺序表C中while (i < A.length) {C.elements[k++] = A.elements[i++];}// 将顺序表B中的元素插入到顺序表C中while (j < B.length) {int x = B.elements[j++];// 找到插入位置int insertPos = 0;while (insertPos < k && C.elements[insertPos] < x) { insertPos++;}// 将元素插入到合适位置for (int m = k; m > insertPos; m--) {C.elements[m] = C.elements[m - 1];}C.elements[insertPos] = x;k++;}C.length = k; // 更新顺序表C的长度}```这个算法的时间复杂度为O(m+n),其中m和n分别为顺序表A 和顺序表B的长度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验目的及要求:
了解和掌握链表的特点;
掌握链表基本操作的实现;
掌握两个有序链表合并的算法
要求完成链表的初始化、插入、有序表合并、显示操作的实现。

实验设备环境及要求:
PC机一台,内存要求128M以上,VC++6.0集成开发环境。

实验内容与步骤:
1、在VC++6.0环境中新建一个工程和C++文件;
2、实现链表初始化、插入、有序合并算法,代码如下:
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
int InitList_L(LinkList &L){
L= (LinkList)malloc(sizeof(LNode));
L->next=NULL;
return 1;
}
int ListInsert_L(LinkList &L,int i,ElemType e){
LinkList p;
p=L;
int j=0;
while(p&&j<i-1){
p=p->next;
++j;
}
if(!p||j>i-1) return 0;
LinkList s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
void Disp_L(LinkList L){
LinkList p=L->next;
if(!p) printf("此链表为空!");
while(p){
printf("%d",p->data);
p=p->next;
}
printf("\n");
}
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ LinkList pa=La->next;
LinkList pb=Lb->next;
LinkList pc=Lc=La;
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;
}
}
pc->next=pa?pa:pb;
free(Lb);
}
void main(){
LinkList La,Lb,Lc;
InitList_L(La);
InitList_L(Lb);
InitList_L(Lc);
ListInsert_L(La,1,2);
ListInsert_L(La,2,3);
ListInsert_L(La,3,5);
Disp_L(La);
ListInsert_L(Lb,1,1);
ListInsert_L(Lb,2,4);
ListInsert_L(Lb,3,6);
ListInsert_L(Lb,4,7);
Disp_L(Lb);
MergeList_L(La,Lb,Lc);
printf("合并之后的链表为:\n");
Disp_L(Lc);
}实验指导与数据处理:
实验结果:235
1467
合并之后的链表为:
1234567
分析讨论:
本次实验通过对链表基本操作和两个有序链表合并算法的实现,加深了对链表特点的理解,并且熟悉了VC++6.0集成环境,虽然在调试过程中遇到一些问题,但经分析后达到了预期的结果。

相关文档
最新文档