/** * 用链表实现 王道P40 T13 * * ①算法思想: * 首先,将两个递增链表合并为递增链表, * 然后断链头插逆置。 * * * ②数据结构: * typedef struct LNode{ * int data; * struct LNode *next; * }LNode,*LinkList; * * ③算法设计 */ #include <stdio.h> #include <iostream> typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; LinkList MinIncreasingRe(LinkList &L1,LinkList &L2){ LinkList p = L1 -> next,q = L2 -> next,r = L1; while(p && q){ if(p -> data > q -> data){ r -> next = q; r = q; q = q -> next; }else{ r -> next = p; r = p; p = p -> next; } } while(p){ r -> next = p; r = p; p = p -> next; } while(q){ r -> next = q; r = q; q = q -> next; } r -> next = NULL; p = L1 -> next; L1 -> next = NULL; while(p){ q = p -> next; //注意 q 要写到 while 里面,而不能在 while 外面定义 q = p -> next; p -> next = L1 -> next; L1 -> next = p; p = q; } return L1; } 以下是测试程序 尾插法建立单链表(有头节点) LinkList CreatLinkListR(){ LinkList L = (LinkList)malloc(sizeof(LNode));//创建头结点,头指针L指向头节点 LinkList p = L,q; 这里不必让 L -> next 指向空,因为L保存了头结点指针,尾插一定会在L后插入一个新节点,所以L后面肯定会有节点而不是空, //p用于保存尾节点指针,因此应允许 p -> next 为空。 int data; while(1){ scanf("%d",&data); if(data == 99999) break; q = (LinkList)malloc(sizeof(LNode)); q -> data = data; p -> next = q; p = q; } p -> next = NULL; return L; } 循环单链表的遍历(有头节点,无头结点) 引入带头结点 L -> next ,传入无头结点 L LinkList Order(LinkList L){ while(L){//当L不是空的时候 printf("%d ",L -> data); L = L -> next; } printf("\n"); } int main(){ LinkList L1 = CreatLinkListR(); LinkList L2 = CreatLinkListR(); Order(L1 -> next); Order(L2 -> next); MinIncreasingRe(L1,L2); Order(L1 -> next); }