单链表中最后一个节点的指针域为空,如果将这个空的指针域指向头结点,
整个链表就形成了一个环形结构,故称为循环链表,这样从任意一个节点出发均可以找到
其他节点。循环链表与单链表的区别仅在于判断最后一个节点是否为头结点,而不是判断节点
是否为空。其插入和删除操作与单链表没有什么区别
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int ElemType;
typedef int Status;
typedef struct Node{
int data;
struct Node * next;
}Node, *Lplink;
/*************************
初始化
输入:链表指针,初始值个数
输出:状态码
功能:新建一个带初始值的链表
*************************/
Status initLink(Lplink *link,int num){
Lplink head = *link;
Lplink new;
head->data = 0;
head->next = NULL;
Lplink tmp = head;
while(num--){
new = (Lplink)malloc(sizeof(Node));
new->data = rand()%100+1;
new->next = tmp->next;
tmp->next = new;
tmp = tmp->next;
}
tmp->next = head;
return OK;
}
/*************************
颠倒链表
输入:链表指针
输出:状态码
功能:将链表的节点颠倒
*************************/
Status invertLink(Lplink * link){
Lplink f = *link;
Lplink s = f->next;
Lplink t = s->next;
do{
s->next = f;
f = s;
s = t;
t = t->next;
}while(f!=*link);
return OK;
}
/*************************
删除前驱
输入:链表指针,删除位置
输出:状态码
功能:将指定位置的前驱节点删除
*************************/
Status deletePrior(Lplink *link,int index){
Lplink prior = *link;
int i=0;
while( prior!=link && i<index){
prior = prior->next;
i++;
}
if( prior==link || i>index){
printf("overflow\n");
return OVERFLOW;
}
//exchange prior and target value
Lplink tmp = prior->next;
int val = prior->data;
prior->data = tmp->data;
tmp->data = val;
//delete tmp
prior->next = tmp->next;
free(tmp);
return OK;
}
/*************************
打印链表
输入:链表指针
输出:状态码
功能:将链表的值一一输出
*************************/
Status printLink(Lplink link){
Lplink tmp = link->next;
while(tmp != link){ //if tmp isn't end node
printf("[%d] ",tmp->data);
tmp = tmp->next;
}
printf("\n");
}
int main(){
int num,index;
printf("[create]enter the num:");
scanf("%d",&num);
Lplink link = (Lplink)malloc(sizeof(Node));
initLink(&link,num);
printLink(link);
invertLink(&link);
printLink(link);
//delete prior
printf("[delete]enter the index:");
scanf("%d",&index);
deletePrior(&link,index);
printLink(link);
return OK;
}