题目:将一带头结点的单链表L=(a1,b1,a2,b2……an,bn)拆成两个带头结点的链表,L1采用尾插,L2采用前插
问题: 调用split函数后无法正常输出L1,L2 。
//split函数
void split(LinkNode*L1,LinkNode*L2,LinkNode*L){
LinkNode*p,*q,*r;
L1 = (LinkNode*)malloc(sizeof(LinkNode));
L2 = (LinkNode*)malloc(sizeof(LinkNode)); //建立L1,L2头结点
L1 = L;
p = L->next;
L2->next = NULL; //L2前插准备工作
r = L1; //L1后插准备工作
while(p!=NULL){
r->next = p;
r = p; //对原列表的后插操作
p = p->next;
q = p->next; //记录原列表的位置
p->next = L2->next;
L2->next = p; //原列表的前插操作
p = q; //回到记录点
}
r->next = NULL;
}
//main函数
int main(){
LinkNode*L,*L1,*L2;
int num,i;
printf("请输入创建多少个结点的链表\n");
scanf("%d",&num);
L = CreatLinkNode(L,num);
DisPlayLinkNode(L);
split(L1,L2,L);
DisPlayLinkNode(L1);
DisPlayLinkNode(L2);
return 0;
}
//完整代码
#include<stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode*next;
}LinkNode;
LinkNode*CreatLinkNode(LinkNode*L,int n){
int i;
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
LinkNode*s,*r;
r = L;
printf("请输入链表元素的值:\n");
for(i=1;i<=n;i++){
s =(LinkNode*)malloc(sizeof(LinkNode));
scanf("%d",&s->data);
s->next = NULL;
r->next = s;
r=s;
}
printf("创建完毕\n");
return L;
}
void DisPlayLinkNode(LinkNode*L){
LinkNode*p;
p = L->next;
while(p!=NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
void split(LinkNode*L1,LinkNode*L2,LinkNode*L){
LinkNode*p,*q,*r;
L1 = (LinkNode*)malloc(sizeof(LinkNode));
L2 = (LinkNode*)malloc(sizeof(LinkNode)); //建立L1,L2头结点
L1 = L;
p = L->next;
L2->next = NULL; //L2前插准备工作
r = L1; //L1后插准备工作
while(p!=NULL){
r->next = p;
r = p; //对原列表的后插操作
p = p->next;
q = p->next; //记录原列表的位置
p->next = L2->next;
L2->next = p; //原列表的前插操作
p = q; //回到记录点
}
r->next = NULL;
}
int main(){
LinkNode*L,*L1,*L2;
int num,i;
printf("请输入创建多少个结点的链表\n");
scanf("%d",&num);
L = CreatLinkNode(L,num);
DisPlayLinkNode(L);
split(L1,L2,L);
DisPlayLinkNode(L1);
DisPlayLinkNode(L2);
return 0;
}