当前位置:文档之家› 单循环链表基本操作

单循环链表基本操作

/*1、CreateList( ):创建一个带头结点的空的单循环链表;
2、InsertList( ):输入一组数据,以0表示输入结束, 并依次建立各个元素结点,逐个插入到单循环链表尾
3、DeleteList( ):删除单循环链表的从第i个数据元素开始的m个数据元素,同时释放被删结点空间
4. ListPrint( ):将单向循环链表的数据元素从表头到表尾依次显示
5. DevList( ):将此单循环链表拆分成两个单循环链表,其中一个包含所有的数据元素为偶数的结点,
另一个包含所有的数据元素为奇数的结点.*/
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node *next;
}LNode,*linklist;
void createlist(linklist &L)
{linklist p=L;
p->next=p;
}
void insertlist(linklist &L)
{int x;
linklist p=L,q;
scanf("%d",&x);
while(x!=0)
{q=(linklist)malloc(sizeof(LNode));
q->data=x;q->next=NULL;
p->next=q;
p=q;
scanf("%d",&x);
}
q->next=L;
}
void printlist(linklist L)
{linklist p=L->next ;
if(p==L)printf("这是一个空表!\n");
while(p!=L){printf("%2d",p->data);p=p->next;}
printf("\n");
}
void deletelist(linklist &L,int i,int m)
{linklist p=L,q;
for(int n=1;n<i;n++)
{p=p->next;
if(p==L)p=p->next;
}
q=p->next;
for(n=0;n<m;n++)
if(q!=L)
{p->next=q->next;
free(q);
q=p->next;
}
else
{q=q->next;
L->next=q->next;
free(q);
q=L->next;
p=L;
}
}
void devlist(linklist L,linklist &La,linklist &Lb) {linklist p=L->next,pa=La,pb=Lb,q;
while(p!=L)
{ if((p->data)%2==0)
{q=(linklist)malloc(sizeof(LNode));
q->data=p->data;
pa->next=q;
pa=q;
}
else
{q=(linklist)malloc(sizeof(LNode));
q->data=p->data;
pb->next=q;
pb=q;
}
p=p->next;
}
pa->next=La;
pb->next=Lb;
}
void main()
{//int i,m;
linklist L,La,Lb;
L=(linklist)malloc(sizeof(LNode));
La=(linklist)malloc(sizeof(LNode));
Lb=(linklist)malloc(sizeof(LNode));
createlist(L);
printf("请输入一组数据, 并以0表示输入结束:\n"); insertlist(L);
printf("单循环链表的数据元素从表头到表尾依次为:\n");
printlist(L);
/*printf("\n请分别输入i、m的值:\n");
scanf("%d%d",&i,&m);
deletelist(L,i,m);
printf("删除操作后的单循环链表的数据元素从表头到表尾依次为:\n"); printlist(L);*/
devlist(L,La,Lb);
printf("拆分后,单循环链表a的数据元素从表头到表尾依次为:\n"); printlist(La);
printf("拆分后,单循环链表b的数据元素从表头到表尾依次为:\n"); printlist(Lb);
}。

相关主题