拆分单链表

*/
 * 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);
}


posted @ 2016-11-16 13:31  壹言  阅读(287)  评论(0编辑  收藏  举报