/**
* 用链表实现 王道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);
}
王道书P40 T13(单链表实现)
最新推荐文章于 2022-11-26 19:14:40 发布