循环链表代码

单链表中最后一个节点的指针域为空,如果将这个空的指针域指向头结点

整个链表就形成了一个环形结构,故称为循环链表,这样从任意一个节点出发均可以找到

其他节点。循环链表与单链表的区别仅在于判断最后一个节点是否为头结点,而不是判断节点

是否为空。其插入和删除操作与单链表没有什么区别

 

#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; }
posted @ 2017-07-05 20:31  Khazix  阅读(638)  评论(0编辑  收藏  举报