题目要求:
代码实现:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList Link_TailInsert(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode *r=L,*s;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}
//将单链表hc拆成A和B两个单链表:
void CutList(LinkList &hc,LinkList &A,LinkList &B)
{
A=hc;
B=(LinkList)malloc(sizeof(LNode));
LNode *p,*q;
p=A->next;
B->next=hc->next->next;q=B->next;
hc=B->next->next;
B->next->next=NULL;
int i=1;
while(hc)
{
if(i%2!=0)
{
p->next=hc;
p=p->next;hc=hc->next;
}
else
{
q=hc;hc=hc->next;
q->next=B->next;
B->next=q;
}
i++;
}
p->next=NULL;
}
void ShowList(LinkList L)
{
LNode *p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void DestroyLinkList(LinkList &L)
{
LNode* p;
while(L)
{
p=L;
L=L->next;
free(p);
}
return;
}
int main()
{
LinkList hc,A,B;
printf("构造数量为偶数个的单链表hc:\n");
hc=Link_TailInsert(hc);
//将单链表hc拆成A和B两个等长单链表:
CutList(hc,A,B);
printf("输出链表A的值:\n");
ShowList(A);
printf("输出链表B的值:\n");
ShowList(B);
DestroyLinkList(A);
DestroyLinkList(B);
return 0;
}
接下来再实现一下王道论坛视频在讲解此题时提供的代码:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList Link_TailInsert(LinkList &L)
{
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode *r=L,*s;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=r->next;
r->next=s;
r=s;
scanf("%d",&x);
}
return L;
}
//将单链表hc拆成A和B两个单链表:
LinkList DisCreate_2(LinkList &A)
{
LinkList B=(LinkList)malloc(sizeof(LNode));
B->next=NULL;
LNode *p=A->next,*q;
LNode *ra=A;
while(p!=NULL)
{
ra->next=p;ra=p;
p=p->next;
q=p->next;
p->next=B->next;
B->next=p;
p=q;
}
ra->next=NULL;
return B;
}
void ShowList(LinkList L)
{
LNode *p=L->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void DestroyLinkList(LinkList &L)
{
LNode* p;
while(L)
{
p=L;
L=L->next;
free(p);
}
return;
}
int main()
{
LinkList hc,A,B;
printf("构造数量为偶数个的单链表hc:\n");
hc=Link_TailInsert(hc);
A=hc;
//将单链表hc拆成A和B两个等长单链表:
B=DisCreate_2(A);
printf("输出链表A的值:\n");
ShowList(A);
printf("输出链表B的值:\n");
ShowList(B);
DestroyLinkList(A);
DestroyLinkList(B);
return 0;
}