拆分单链表

来源:互联网 发布:张震讲鬼故事的软件 编辑:程序博客网 时间:2024/05/04 21:11
*/ * 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];                                      //创建数据节点*ss->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);}

0 0
原创粉丝点击