/*cyclelinklist.h*/#pragma once#include<stdio.h>#include<stdlib.h>typedefint ElemType;//定义数据元素类型为inttypedefstruct CLNode {//线性表的链式存储结构定义
ElemType data;struct CLNode* next;}CLNode,*CLinkList;//建立带头节点的单链表L,输入n个元素的值
CLinkList createLinkList(int n){
CLNode *L,*q,*p;
L =(CLNode*)malloc(sizeof(CLNode));
L->next =NULL;//链表L的头的数据是空的,只有一个指针,方便后面的插入/删除
q = L;for(int i =0; i < n; i++){
p =(CLNode*)malloc(sizeof(CLNode));printf("请输入第%d个值:", i +1);scanf("%d",&p->data);
p->next =NULL;
q->next = p;//将当前结点的next指针指向p
q = p;//将当前结点更新为p}
q->next = L;//将尾节点指向头return L;}//打印表中各元素的值voidprintLinkList(CLinkList L){
CLNode* p;
p = L->next;printf("\n单向循环单链表中元素为:");while(p!=L){//头与尾重合printf("%d ", p->data);
p = p->next;}printf("\n");}//在带头节点的单链表L中的i位置插入元素e,成功返回1,不成功返回0intinsertLinkList(CLinkList L,int i, ElemType e){
CLNode *p,*q;
p = L;int j =0;while(p->next!=L&&j < i -1){//不断移动游标p,直到指向要插入的前一个位置(当游标p到达尾节点会直接跳出循环)
p = p->next;//由于L的数据是空的,所以这里直接略掉了头节点
j++;}if(j != i -1){//若游标p没有在待插入位置的前一个位置,说明已经越界printf("插入元素越界!\n");return0;}
q =(CLNode*)malloc(sizeof(CLNode));
q->data = e;
q->next = p->next;//将新增元素的指针指向游标p的下一个元素
p->next = q;//将游标p的指针指向新增元素return1;}//在带头节点的单链表L中删除第i个元素,并由e返回其值,成功则返回1,失败返回0intdeletLinkList(CLinkList L,int i, ElemType* e){
CLNode *p,*q;int j =0;
p = L;while(p->next!=L&&j < i -1){//不断移动游标p,直到指向要删除的前一个位置
p = p->next;
j++;}if(p->next == L||j != i -1){printf("删除元素越界!\n");return0;}
q = p->next;//q表示要删除的元素*e = q->data;//获取要删除的元素的值
p->next = q->next;//游标p指向要删除元素的下一个位置free(q);//释放已删除元素的空间return1;}//在带头节点的单链表L中查找与给定元素e相同的位序intlocateLinkList(CLinkList L, ElemType e){int i =0;
CLNode* p;
p = L->next;while(p->next!=L&&p->data != e){
p = p->next;
i++;}if(p->data != e)return0;return++i;}
/*main.cpp*//*
单向循环链表的特性是从任何一个结点开始(不要求是链表的头节点),都可以遍历整个链表,
这是单链表不具备的特性。这一特性使得循环链表可以不设头指针,而只设尾指针,因为链尾
指针后移一位就是头指针。
*/#include"cyclelinklist.h"intmain(void){
CLinkList L;int n, i, e, state;printf("请输入创建链表的长度:");scanf("%d",&n);
L =createLinkList(n);printLinkList(L);printf("\n请输入插入链表的位置:");scanf("%d",&i);printf("请输入插入链表的元素:");scanf("%d",&n);insertLinkList(L, i, n);printLinkList(L);printf("\n请输入删除链表的位置:");scanf("%d",&i);deletLinkList(L,i,&e);printf("删除的元素为:%d\n", e);printLinkList(L);printf("\n请输入查找的元素:");scanf("%d",&e);
state=locateLinkList(L,e);if(state){printf("链表中元素%d的位置为:%d\n",e,state);}elseprintf("查无此数!\n");return1;}