这个功能的实现还是踩了点坑的,但是让我明白了打印真的很重要
这里代码块有两部分,第一段是没有打印的代码。第二段是有打印的代码,想研究的话可以运行一下第二段代码。
#include#include 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#include 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的地址: %dn",L); // printf("创建-r的地址: %dn",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("%dn",j++); } printf("创建完成!n"); r->next = L; // 最后一个指向L的头节点 // printf("r最后一个指向: %dn",L); } // 打印 void printList (LinkList L) { Node *pre; pre = L->next; int i = 1; // 标记循环了几次 if(pre->next == L) { // printf("if***pre->next == L指向地址:%dt",pre); return; } // printf("打印-L的地址: %dn",L); // 一样 // printf("打印-pre的地址: %dn",L); // 一样 while(pre->next != L->next) { // 这里不能写成pre->next != L,否则缺少一次循环 printf("%d -> ",pre->data); // printf("循环次数 = %dn",i++); // printf("pre指向地址:%dt",pre); // printf("L->next指向地址:%dt",L->next); // 这个值不会变 // printf("n"); // printf("n"); pre = pre->next; // printf("pre = pre->next指向地址:%dt",pre); // printf("n"); // printf("n"); } // pre->next = L; // 最后一个指向L的头节点 printf("循环结束了!!!n"); // printf("结束了L的地址: %dn",L); // printf("结束了L->next指向地址:%dt",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; }



