实验1-两个有序链表的合并
实现两个链表的合并数据结构课程设计

实现两个链表的合并数据结构课程设计实现两个链表的合并。
输入两个链表的长度和节点,输出合并后的链表。
算法设计:使用递归的思想,对于传入的两个链表,比较他们的表头节点,将较小的节点加入到新链表中,然后递归将较小节点所在的链表和另一个链表继续合并,最后返回新链表即可。
实现过程如下:Step 1:定义链表数据结构typedef struct Node{int data;struct Node* next;}Node, *List;Step 2:定义合并函数List merge(List List1, List List2){ 合并两个链表if(List1 == NULL) return List2; 如果List1为空,则返回List2if(List2 == NULL) return List1; 如果List2为空,则返回List1List newList = NULL; 新链表的表头指针if(List1->data < List2->data){ 如果List1的表头节点的值小于List2的表头节点的值newList = List1; 将List1的表头节点作为新链表的表头节点newList->next = merge(List1->next, List2); 递归将List1的剩余节点和List2继续合并}else{ 若List1的表头节点的值大于等于List2的表头节点的值newList = List2; 将List2的表头节点作为新链表的表头节点newList->next = merge(List1, List2->next); 递归将List2的剩余节点和List1继续合并}return newList; 返回已合并的新链表的表头指针}Step 3:测试代码#include<stdio.h>#include<stdlib.h>int main(){int len1, len2, elem;scanf("%d%d", &len1, &len2);List List1 = NULL, List2 = NULL, p = NULL;for(int i = 0; i < len1; i++){ 创建List1 scanf("%d", &elem);List node = (List)malloc(sizeof(Node));node->data = elem;node->next = NULL;if(List1 == NULL){List1 = node;p = List1;}else{p->next = node;p = p->next;}}for(int i = 0; i < len2; i++){ 创建List2 scanf("%d", &elem);List node = (List)malloc(sizeof(Node));node->data = elem;node->next = NULL;if(List2 == NULL){List2 = node;p = List2;}else{p->next = node;p = p->next;}}List newList = merge(List1, List2); 合并两个链表p = newList; 输出新链表while(p != NULL){printf("%d ", p->data);p = p->next;}return 0;}示例输入:3 41 5 103 6 8 9示例输出:1 3 5 6 8 9 10。
设计两个有序单链表的合并排序算法

设计两个有序单链表的合并排序算法有序单链表的合并排序,是一种高效的排序算法,可以在较短的时间内对大量数据进行排序。
这种排序算法的核心在于将两个有序的单链表合并成一个有序的单链表,然后再对整个链表进行排序。
合并排序算法的基本原理是分治法。
将需要排序的数组不断地分解成两个子数组,直到每个子数组只包含一个元素为止。
然后再将这些子数组两两合并,直到整个数组被合并成一个有序的数组为止。
这里介绍两个有序单链表的合并排序算法,它们分别是迭代算法和递归算法。
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为两个链表的总长度。
合并两个有序链表(C语言)

合并两个有序链表(C语⾔)合并两个有序链表将两个有序链表合并为⼀个新的有序链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
输⼊:1->2->4, 1->3->4输出:1->1->2->3->4->4分析:两个链表为有序链表,所以依次遍历两个链表⽐较⼤⼩即可。
下边是代码实现:1/**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * struct ListNode *next;6 * };7*/8910struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){11if(l1==NULL){12return l2;13 }14if(l2==NULL){15return l1;16 }17struct ListNode *l = (struct ListNode*)malloc(sizeof(struct ListNode));18 l->next = NULL;19struct ListNode *list1 = l1;20struct ListNode *list2 = l2;21if(l1->val<l2->val){22 l->val=l1->val;23if(list1->next==NULL){24 l->next=list2;25return l;26 }27 list1=list1->next;28 }else{29 l->val=l2->val;30if(list2->next==NULL){31 l->next=list1;32return l;33 }34 list2=list2->next;35 }36struct ListNode *list = l;37while(list1->next!=NULL&&list2->next!=NULL){38if(list1->val<=list2->val){39struct ListNode *body = (struct ListNode *)malloc(sizeof(struct ListNode));40 body->val = list1->val;41 body->next = NULL;42 list->next = body;43 list = list->next;44 list1 = list1->next;45 }else{46struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));47 body->val=list2->val;48 body->next=NULL;49 list->next=body;50 list=list->next;51 list2=list2->next;52 }53 }54if(list1->next==NULL){55while(list2->next!=NULL){56if(list1->val<=list2->val){57 list->next = list1;58 list = list->next;59 list->next=list2;60return l;61 }else{62struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));63 body->val=list2->val;64 body->next=NULL;65 list->next=body;66 list=list->next;67 list2=list2->next;68 }69 }70 }else{71while(list1->next!=NULL){72if(list2->val<=list1->val){73 list->next=list2;74 list=list->next;75 list->next=list1;76return l;77 }else{78struct ListNode *body = (struct ListNode*)malloc(sizeof(struct ListNode));79 body->val=list1->val;80 body->next=NULL;81 list->next=body;82 list=list->next;83 list1=list1->next;84 }85 }86 }87if(list1->next==NULL&&list2->next==NULL){88if(list1->val<=list2->val){89 list->next = list1;90 list=list->next;91 list->next=list2;92 }else{93 list->next=list2;94 list=list->next;95 list->next=list1;96 }97 }9899100101return l;102 }。
数据结构实验两个有序顺序表的合并

南昌大学实验报告学生姓名:李木子学号: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 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。
数据结构实验报告 有序表的合并(优质参考)

数据结构实验报告实验题目:有序表的合并姓名:张耀班级:计嵌151学号: 1513052017一、实验目的把两个有序表归并为一个有序表。
二、数据结构设计(1)存储设计:采用带头结点的单链表存储数据。
输入:数据通过键盘有序输入输出:屏幕显示两个有序表及归并后的表(2)函数设计:CreateList(int n);// 创建具有n个元素的线性链表ListDisplay();//输出表元素Combine(LinkList LA, LinkList LB);//归并单链表LA,LB(3)两个有序表合并算法描述:Step1:初始化。
1.1设置工作指针pa,pb,分别指向两个有序表LA,LB的首元结点。
1.2生成新表LC的头结点,工作指针pc指向LC。
Step2:只要pa和pb有所指,循环执行下列操作。
2.1生成一新节点,链到LC表尾,pc指向它。
2.2如果pa->data<=pb->data:pc->data=pa->data;pa后移。
2.3否则:pc->data=pb->data;pb后移。
Step3:如果pa空,把pb开始的结点依次复制到pc后。
Step4: 如果pb空,把pa开始的结点依次复制到pc后。
三、算法设计与N-S图(1)算法设计:求归并表的过程是在元素有序的情况下不断地从两表中取出元素,添加到新表中,所以元素采取表尾插入。
设两个有序表SA,SB,归并后的有序表为SC,取元素的过程是:依次扫描SA,SB中的元素,比较当前元素的值,将较小的元素赋给SC,直到一个顺序有序表扫描完毕,然后将另一个顺序有序表中余下元素复制到SC中。
(2)程序流程图开始初始化:pa = LA.Head->next; pb = LB.Head->next;pc = Head;pa和pb都不为空生成新节点,连接到LC表尾,pc指向它pa->data<=pb->datapc->data = pb->data;pb = pb->next;pc->data = pa->data;pa = pa->next;pa==N ULLPb!=NULL把pb开始的结点依次复制到pc后面pb==N ULLPa!=NULL把pa开始的结点依次复制到pc后面四、程序清单#include<iostream>using namespace std;结束#include"process.h"struct Node{int data;//数据域,存放表元素Node *next;//指针域,指向下一个结点};class LinkList{private:Node *Head;// 链表头指针public:LinkList();//构造函数,创建空链表void CreateList(int n);//创建具有n个元素的线性链表void ListDisplay();//输出表元素void Combine(LinkList, LinkList);//合并};LinkList::LinkList(){//构建函数,建一空链表Head = new Node;Head->next = NULL;}void LinkList::CreateList(int n){//尾插法(正序)创建具有n个元素的线性表Node *p, *s;//设置工作指针。
有序链表合并算法

有序链表合并算法有序链表合并算法(Merger Algorithm for Ordered Lists)是在计算机科学领域中,具有较高实用价值和普适性的算法之一。
该算法主要用于将两个有序链表合并成一个新的有序链表,具有时间复杂度和空间复杂度都比较优秀的特点,在利用链表进行数据处理的时候被广泛使用。
本文将详细介绍有序链表合并算法的定义、流程、时间复杂度、空间复杂度等方面的内容。
### 一、算法定义有序链表合并算法是指将两个有序链表合并成一个新的有序链表的算法,其中有序链表是指链表中的元素按照一定的顺序排列。
有序链表合并的过程也就是将两个有序链表的元素按照特定规则进行排序,并将排序后的元素再次存储在一个新的有序链表中的过程。
通常情况下,有序链表合并算法可以采用递归或非递归的方式实现。
在递归实现中,算法通过将原有序链表不断划分成子序列,最终递归合并子序列的方式来完成整个有序链表的合并;而在非递归的实现中,则采用循环遍历原始有序链表的方式,逐个将元素进行比较,并放置到新链表的相应位置上。
### 二、算法流程下面是有序链表合并算法的流程:输入:两个有序链表l1和l2。
输出:合并后的有序链表l3。
1. 创建新的空链表l3。
2. 比较l1和l2的头结点,将较小的节点插入到l3链表的末尾,并将该节点指针后移一位。
3. 重复步骤2,直到l1或l2中的任一链表被遍历完。
此时,将剩余未被遍历完的链表中的节点都插入到l3的末尾。
4. 返回合并后的有序链表l3。
### 三、算法时间复杂度有序链表合并算法的时间复杂度为O(n),其中n为合并后有序链表中的元素个数。
具体地,当使用非递归实现算法时,每个链表中的每个元素都会被访问一次,因此算法的时间复杂度与元素个数成线性关系。
而对于递归实现算法,由于每次合并时需要将原有序列划分为两个子序列,因此递归的次数为log2n,每次递归的时间复杂度也为O(n),因此总时间复杂度也为O(nlog2n)。
链表合并实验报告

《数据结构》实验报告◎实验题目: 实现两个有序循环链表的合并◎实验目的:掌握链表的建立、遍历以及数据的插入,加深对链表的理解。
◎实验内容:设A与B分别为两个带有头结点的有序循环链表(所谓有序是指链接点按数据域值大小链接,本题不妨设按数据域值从小到大排列),list1和list2分别为指向两个链表的头指针。
请写出将这两个链表合并为一个带头结点的有序循环链表的算法。
一、需求分析1、输入:该实验需要建立循环链表,以及读入数据,输出数据,并实现合并。
该链表输入为整数形式,输入值的范围为整个整数域。
2、输出:而输出的形式为整数。
3、程序功能:该程序实现了循环链表的建立,读入和输出数据,主要功能为实现了两个有序循环链表的合并。
4、程序执行命令:(1)创建链表(2)输入数据(3)合并链表(4)输出合并后链表(5)结束5、测试数据:假设第一个链表的输入数据个数为5,其分别为1、3、5、7、9,第二个链表的输入数据个数为3个,其分别为7、9、10,则合并后应输出结果:1 3 5 7 7 9 9 10。
二概要设计为了实现上述操作,应以单向循环链表为存储结构。
本程序的主程序的流程为:本程序的调用函数有创建链表函数create,输出函数displist,以及合并函数add三个模块,其中这三个函数都在主函数中被调用,三个调用函数为平行关系。
三详细设计1.元素类型,结点类型和指针类型:typedef int elemtype;typedef struct lnode{elemtype data;struct lnode *next;}linklist;linklist *s,*r;linklist *list1,*list2,*list3; 2.每个模块的分析:(1)主程序模块:main(){linklist *l1,*l2,*l3;int i,x,n;printf("请输入要建立的链表节点个数:\n");scanf("%d",&n);create(l1,n);displist(l1);getch();printf("请输入要建立的链表节点个数:\n");scanf("%d",&n);create(l2,n);displist(l2);getch();add(l1,l2,l3);printf("合并后链表:\n");displist(l3);getch();return 0;}(2)链表创建并输入数据create(linklist *&l,int n){linklist *s,*r;int i;l=(linklist *)malloc(sizeof(linklist));l->next=NULL;r=l;for(i=0;i<n;i++){s=(linklist *)malloc(sizeof(linklist));printf("\n请输入新节点数据:\n");scanf("%d",&s->data) ;r->next=s;r=s;}r->next=l->next;}(3)数据输出displist(linklist *l){linklist *p=l->next;do{printf("%5d",p->data);p=p->next;}while(p!=l->next);printf("\n");}(4)链表合并add(linklist *l1,linklist *l2,linklist *&l3){linklist *list1,*list2,*list3;l3=(linklist *)malloc(sizeof(linklist));l3->next=NULL;list3=l3;list1=l1->next;list2=l2->next;do{if(list1->data<=list2->data){list3->next=list1;list1=list1->next;list3=list3->next;}else{list3->next=list2;list2=list2->next;list3=list3->next;}} while(list3->next!=l1->next&&list3->next!=l2->next);if(list3->next==l2->next)while(list3->next!=l1->next){list3->next=list1;list3=list1;list1=list1->next;}elsewhile(list3->next!=l2->next){list3->next=list2;list3=list2;list2=list2->next;}list3->next=l3->next;}(5)函数调用关系图main()create()displist()add()diaplist()3.完整的程序:(见源文件).四使用说明、测试分析及结果1.程序使用说明:(1)本程序的运行环境为VC6.0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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集成环境,虽然在调试过程中遇到一些问题,但经分析后达到了预期的结果。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _Node
{
int value;
struct _Node *next;
}Node, *PNode;
PNode BuildLink(int n, int *pi); //构造一个节点数目为n个的链表, 返回链表头指针
PNode MergeLink(PNode p1, PNode p2); //合并两个有序单链表void OutputLink(PNode ph); //输出单链表
int main()
{
int a[] = {3, 12, 44, 55, 67, 89, 555};
int b[] = {4, 46, 68, 69, 70, 90, 98, 888, 999 ,8888}; PNode p1 = BuildLink(sizeof(a)/sizeof(int), a);
PNode p2 = BuildLink(sizeof(b)/sizeof(int), b);
OutputLink(p1);
OutputLink(p2);
PNode pMerge = MergeLink(p1, p2);
OutputLink(pMerge);
getchar();
return0;
}
PNode BuildLink(int n, int *pi)
{
int i;
PNode ph=NULL, pn;
for(i=0; i<n; ++i)
{
if(!(pn=(PNode)malloc(sizeof(Node))))
{
printf("malloc error.\n");
exit(1);
}
pn->value = *(pi+n-1-i);
pn->next = ph;
ph = pn;
}
return ph;
}
void OutputLink(PNode ph)
{
while(ph)
{
printf("%d ", ph->value);
ph = ph->next;
}
printf("\n");
}
//合并两个有序单链表,并返回合并后新链表的头指针
PNode MergeLink(PNode p1, PNode p2)
{
if(!p1) return p1; //如果链表为空,则直接返回另一个链表if(!p2) return p2; //如果链表为空,则直接返回另一个链表
PNode ph, p; //ph 合并后新链表的头指针if(p1->value < p2->value)
{
ph = p1;
p = p1;
p1 = p1->next;
}
else
{
ph = p2;
p = p2;
p2 = p2->next;
}
while(p1 && p2)
{
if(p1->value < p2->value) {
p->next = p1;
p = p1;
p1 = p1->next;
}
else
{
p->next = p2;
p = p2;
p2 = p2->next;
}
}
if(!p1) p->next = p2;
if(!p2) p->next = p1;
return ph;
}
t=(LinkList)malloc(sizeof(LNode));
t->data=pa->data;
pc->next=t;
pc=t;
pa=pa->next;
}
else {
t=(LinkList)malloc(sizeof(LNode));
t->data=pb->data;
pc->next=t;
pc=t;
pb=pb->next;
}
}
while(pa){
t=(LinkList)malloc(sizeof(LNode));
t->data=pa->data;
pc->next=t;
pc=t;
pa=pa->next;
}
while(pb){
t=(LinkList)malloc(sizeof(LNode));
t->data=pb->data;
pc->next=t;
pc=t;
pb=pb->next;
}
t->next=NULL;。