循环链表的规则?
循环链表的运算实现算法和非循环链表运算算法基本相同,之是对表尾的判断做了改变。例如,在头结点为*h的循环单链表中,判断表空的条件为h->next==h,判断*p为尾结点的条件是p->next==h
循环链表的实现。
/*
循环链表:
判断表空的条件是:h->next=h;
判断结点是否是尾结点:l->next=h;
*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node *next;
}NODE,*PNODE;
PNODE createList(PNODE);
void travleList(PNODE);
void insertList(PNODE,int,int);
void delList(PNODE,int,int *);
int lengthList(PNODE);
bool isEmpty(PNODE);
void main()
{
PNODE phead=(PNODE)malloc(sizeof(NODE));
if(phead==NULL)
{
printf("内存分配失败");
exit(-1);
}
phead->next=phead;
//创建循环链表
phead=createList(phead);
//遍历循环链表
travleList(phead);
//单循环链表插入
printf("开始插入结点");
insertList(phead,3,5);
//遍历循环链表
travleList(phead);
//单循环链表删除
printf("开始删除结点");
int val;
delList(phead,2,&val);
//遍历循环链表
travleList(phead);
}
PNODE createList(PNODE phead)
{
PNODE ptail=phead;
int len,val;
printf("请输入需要创建结点的个数:");
scanf("%d",&len);
for(int i=0;i<len;i++)
{
PNODE pnew=(PNODE)malloc(sizeof(NODE));
if(NULL==pnew)
{
printf("内存分配失败");
exit(-1);
}
printf("请给第%d个结点赋值",i+1);
scanf("%d",&val);
pnew->next=NULL;
pnew->data=val;
//开始组成循环单链表
pnew->next=phead;//都指向头结点。
ptail->next=pnew;//用一个替代结点来帮助变换。
ptail=pnew;
}
return phead;
}
void travleList(PNODE phead)
{
PNODE pnew=phead->next;
while(pnew!=phead)
{
printf("%d ",pnew->data);
pnew=pnew->next;
}
printf("\n");
}
void insertList(PNODE phead,int pos,int val)
{
PNODE pnew=phead;
int i=0;
// 传统插入方法。不能使用哪个高效算法。
if(pnew==NULL||pos<1||pos>lengthList(phead)+1)
{
printf("无法插入");
return;
}
while(i<pos-1)
{
pnew=pnew->next;
i++;
}
//开始插入
//造出新结点,并初始化
PNODE p=(PNODE)malloc(sizeof(NODE));
if(NULL==p)
{
printf("内存分配失败");
exit(-1);
}
p->next=NULL;
p->data=val;
//准备插入
p->next=pnew->next;
pnew->next=p;
}
void delList(PNODE phead,int pos,int *val)
{
int i=0;
PNODE pnew=phead;
if(pnew==NULL||pos<1||pos>lengthList(phead))
{
printf("无法删除");
return;
}
while(i<pos-1)
{
pnew=pnew->next;
i++;
}
//开始删除
PNODE q=pnew->next;
*val=q->data;
printf("%d ",*val);
pnew->next=pnew->next->next;
free(q);
}
int lengthList(PNODE phead)
{
// 主要不需要插入结点,就不需要创造结点,申请内存pnew=(PNODE)malloc(sizeof(NODE));,遍历长度,根本不需要
int i=0;
PNODE pnew=phead;
while(pnew->next!=phead)
{
pnew=pnew->next;
i++;
}
return i;
}
bool isEmpty(PNODE phead)
{
if(phead->next==phead)
return true;
else
return false;
}
转载于:https://blog.51cto.com/1464490021/1864224