递归调用 简单
有点像归并排序的合并部分吧。
因为是用vs创建的工程,所以主函数是_tmain。
1 // 链表.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 6 7 typedef struct Node { 8 int data; 9 struct Node *next; 10 11 } LinkList; 12 13 14 //链表组合的函数 输入:两个有序无头结点链表 输出:将链表组合成一个无头结点有序链表 15 LinkList * combie(LinkList *l1, LinkList * l2) { 16 17 LinkList * p=NULL; 18 19 if (l1==NULL && l2==NULL) 20 { 21 p = NULL; 22 } 23 if (l1==NULL&&l2!=NULL) 24 { 25 p = (LinkList *)malloc(sizeof(LinkList)); 26 p->data = l2->data; 27 p->next = combie(NULL, l2->next); 28 29 } 30 31 if (l2 == NULL&&l1 != NULL) 32 { 33 p = (LinkList *)malloc(sizeof(LinkList)); 34 p->data = l1->data; 35 p->next = combie(l1->next,NULL); 36 37 } 38 if (l1!=NULL && l2!=NULL) 39 { 40 p = (LinkList *)malloc(sizeof(LinkList)); 41 42 p->data = l1->data <= l2->data ? l1->data : l2->data; 43 p->next = combie(l1->data <= l2->data ? l1->next : l1, l1->data <= l2->data ? l2 : l2->next); 44 45 } 46 return p; 47 } 48 49 50 51 //根据数组创建无头结点的链表 52 LinkList * create(int a[], int n) { 53 LinkList *h = NULL, *p, *pre = NULL; 54 for (int i = 0; i < n; i++) 55 { 56 p=(LinkList *)malloc(sizeof(LinkList)); 57 p->data = a[i]; 58 if (pre) pre->next = p; 59 pre = p; 60 if (i == 0) h = p; 61 if (i == n - 1) p->next = NULL; 62 63 } 64 return h; 65 66 67 } 68 69 70 //打印输出无头结点的链表 71 void display(LinkList *list) { 72 LinkList *p = list; 73 while (p != NULL) 74 { 75 cout << p->data << " "; 76 p = p->next; 77 } 78 cout << endl; 79 80 } 81 82 int _tmain(int argc, _TCHAR* argv[]) 83 { 84 int a []= { 1, 2, 10, 80,500 }; 85 LinkList *l1 = create(a,5); 86 display(l1); 87 int b[] = { 0,4, 5, 100, 177,250 }; 88 LinkList *l2 = create(b, 6); 89 display(l2); 90 LinkList * p = combie(l1, l2); 91 display(p); 92 system("pause"); 93 return 0; 94 }
stdafx.h 的内容挺简单的
// stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 // #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> // TODO: 在此处引用程序需要的其他头文件 #include <iostream> #include <cstdlib> using namespace std;