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