?这个功能的实现还是踩了点坑的,但是让我明白了打印真的很重要
这里代码块有两部分,第一段是没有打印的代码。第二段是有打印的代码,想研究的话可以运行一下第二段代码。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
}Node,*LinkList;
// 初始化
LinkList initList () {
LinkList L = (Node *) malloc (sizeof(Node));
L->next = NULL;
return L;
}
// 尾插法创建
void createList(LinkList L) {
Node *r,*s;
int data;
r = L;
printf("输入(-1代表结束):");
while(1) {
scanf("%d",&data);
// 循环单链表这里不能使用return,
// 否则就是直接退出函数了,
// 不会执行下边的"创建完成"及已下的代码了
if(data == -1) break;
s = (Node *) malloc (sizeof(Node));
s->data = data;
r->next = s;
r = s;
}
printf("创建完成!\n");
r->next = L; // 最后一个指向L的头节点
}
// 打印
void printList (LinkList L) {
Node *pre;
pre = L->next;
if(pre->next == L) {
return;
}
while(pre->next != L->next) { // 这里不能写成pre->next != L,否则缺少一次循环
printf("%d -> ",pre->data);
pre = pre->next;
}
printf("循环结束了!!!\n");
printf("\n");
}
LinkList mergeLists(LinkList LA,LinkList LB) {
Node *pa,*pb;
pa = LA;
pb = LB;
while(pa->next != LA) pa = pa->next;
while(pb->next != LB) pb = pb->next;
pb->next = LA;
pa->next = LB->next;
free(LB); // 释放LB的头节点
return LA;
}
int main() {
LinkList LA,LB;
LA = initList();
createList(LA);
printList(LA);
LB = initList();
createList(LB);
printList(LB);
mergeLists(LA,LB);
printList(LA);
return 0;
}
?
#include <stdio.h>
#include <stdlib.h>
/*
* 条件:p->next = L
*/
typedef struct Node {
int data;
struct Node *next;
}Node,*LinkList;
// 初始化
LinkList initList () {
LinkList L = (Node *) malloc (sizeof(Node));
L->next = NULL;
return L;
}
// 尾插法创建
void createList(LinkList L) {
Node *r,*s;
int data;
r = L;
// int j = 1;
// printf("创建-L的地址: %d\n",L);
// printf("创建-r的地址: %d\n",L);
printf("输入(-1代表结束):");
while(1) {
scanf("%d",&data);
// 循环单链表这里不能使用return,
// 否则就是直接退出函数了,
// 不会执行下边的"创建完成"及已下的代码了
if(data == -1) break;
s = (Node *) malloc (sizeof(Node));
s->data = data;
r->next = s;
r = s;
// printf("%d\n",j++);
}
printf("创建完成!\n");
r->next = L; // 最后一个指向L的头节点
// printf("r最后一个指向: %d\n",L);
}
// 打印
void printList (LinkList L) {
Node *pre;
pre = L->next;
int i = 1; // 标记循环了几次
if(pre->next == L) {
// printf("if***pre->next == L指向地址:%d\t",pre);
return;
}
// printf("打印-L的地址: %d\n",L); // 一样
// printf("打印-pre的地址: %d\n",L); // 一样
while(pre->next != L->next) { // 这里不能写成pre->next != L,否则缺少一次循环
printf("%d -> ",pre->data);
// printf("循环次数 = %d\n",i++);
// printf("pre指向地址:%d\t",pre);
// printf("L->next指向地址:%d\t",L->next); // 这个值不会变
// printf("\n");
// printf("\n");
pre = pre->next;
// printf("pre = pre->next指向地址:%d\t",pre);
// printf("\n");
// printf("\n");
}
// pre->next = L; // 最后一个指向L的头节点
printf("循环结束了!!!\n");
// printf("结束了L的地址: %d\n",L);
// printf("结束了L->next指向地址:%d\t",L->next);
printf("\n");
}
LinkList mergeLists(LinkList LA,LinkList LB) {
Node *pa,*pb;
pa = LA;
pb = LB;
while(pa->next != LA) pa = pa->next;
while(pb->next != LB) pb = pb->next;
pb->next = LA;
pa->next = LB->next;
free(LB); // 释放LB的头节点
return LA;
}
int main() {
LinkList LA,LB;
LA = initList();
createList(LA);
printList(LA);
LB = initList();
createList(LB);
printList(LB);
mergeLists(LA,LB);
printList(LA);
return 0;
}
|