*/
* Copyright (c) 2016,烟台大学计算机与控制工程学院
* All rights reserved.
* 文件名:text.html
* 作者:常轩
* 微信公众号:Worldhello
* 完成日期:2016年11月16日
* 版本号:V1.0
* 程序输入:无
* 程序输出:见运行结果
*/
//有一个带头结点的单链表L={a1,b1,a2,b2,.....,an,bn},设计一个算法将其拆分成两个带头节点的单链表L1,L2,L1={a1,a2,....}L2={b1,b2,...}
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LinkList;
void CreateListF(LinkList * &L,ElemType a[],int n) //头插法创建链表
{
LinkList * s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL; //创建头结点,其next域为空
for(i=0;i<n;i++) //循环建立数据节点
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i]; //创建数据节点*s
s->next=L->next; //将*s插在原开始节点之前头开始节点之后
L->next=s;
}
}
void split(LinkList * &L,LinkList * &L1,LinkList *&L2)
{
LinkList *p=L->next,*q,*r1;//p指向第一个数据节点
L1=L; //L1指向原来L的头结点
r1=L1; //r1始终指向L1的尾节点
L2=(LinkList *)malloc(sizeof(LinkList));//创建L2的头结点
L2->next=NULL; //置L2的指针域为NULL
while(p!=NULL)
{
r1->next=p; //采用尾插法将*p(data值为a1)插入L1中
r1=p;
p=p->next; //p移向下一个节点(data值为b1)
q=p->next; //由于
p->next=L2->next;
L2->next=p;
p=q;
}
r1->next=NULL;
}
void DispList(LinkList * L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
LinkList * L,*L1,*L2;
ElemType a[6]={1,2,3,4,5,6};
CreateListF(L,a,6);
DispList(L);
split(L,L1,L2);
DispList(L1);
DispList(L2);
}