createLinkList() //创建并初始化单循环链表
createNode() //创建结点
insertNode(LinkList *list,Elment data) //插入结点
insertByIndex(LinkList *list, int i,Elment data) //按索引位置插入结点
updateNode(LinkList *list, int i,Elment newData) //修改结点信息
deleteNode(LinkList *list, int i) //删除结点
getLength(LinkList *list) //获取链表长度
#include<stdio.h>
#include<stdlib.h>
#define SUCCESS 0
#define ERROR -1
typedef char Elment;
//单链表存储结构
typedef struct Node
{
Elment data;
struct Node *next;
}Node;
//尾指针结构体
typedef struct LinkList
{
struct Node *rear; //尾指针
int length; //单链表的长度
}LinkList;
//创建并初始化单循环链表
LinkList * createLinkList()
{
Node *head = (Node *)malloc(sizeof(Node));
head->next = head;
LinkList *linkList = (LinkList *)malloc(sizeof(LinkList));
linkList->length = 0;
linkList->rear = head;
return linkList;
}
//创建结点
Node * createNode(Elment data)
{
Node *node = (Node *)malloc(sizeof(Node));
node->next = NULL;
node->data = data;
return node;
}
//插入结点
int insertNode(LinkList *list,Elment data)
{
Node *newNode = createNode(data);
Node *p = list->rear;
newNode->next = p->next; //
p->next = newNode; //切记写反
list->rear = newNode; //更新位指针
list->length++;
return SUCCESS;
}
//指定位置插入结点
int insertByIndex(LinkList *list, int i,Elment data)
{
if (i <= 0) return ERROR;
int k = 1;
Node *head = list->rear->next;
Node *p = head->next;
while (i>k && p->next != head)
{
p = p->next;
k++;
}
Node *newNode = createNode(data);
if (p == list->rear) //判断指针p是否指向尾指针
{
list->rear = newNode; //更新尾指针
}
newNode->next = p->next;
p->next = newNode;
return SUCCESS;
}
//修改结点信息
int updateNode(LinkList *list, int i,Elment newData)
{
if (i <= 0) return ERROR;
int k = 1;
Node *head = list->rear->next;
Node *p = head->next;
while (i>k && p->next != head)
{
p = p->next;
k++;
}
p->data = newData;
return SUCCESS;
}
//删除结点
int deleteNode(LinkList *list, int i)
{
if (i <= 0) return ERROR;
int k = 1;
Node *head = list->rear->next;
Node *p = head->next;
while (i-1>k && p->next != head) //删除结点为 a(i) 则p指针指向a(i-1)结点的地址
{
p = p->next;
k++;
}
Node *q = p->next;
p->next = q->next;
if (q == list->rear) list->rear = p; //判断是否为尾指针
free(q);
return ERROR;
}
//遍历单循环链表
int showLinkList(LinkList *list)
{
Node *p = list->rear->next->next; //第一个结点(a1)头结点的下一个
while (p != list->rear->next)
{
printf("%c ", p->data);
p = p->next;
}
putchar('\n');
return SUCCESS;
}
//获取链表长度
int getLength(LinkList *list)
{
return list->length;
}
int main()
{
LinkList * list = createLinkList();
insertNode(list, 'A');
insertNode(list, 'B');
insertNode(list, 'C');
insertNode(list, 'D');
printf("创建单循环链表并插入ABCD \n");
printf("遍历单循链表:");
showLinkList(list);
printf("\n在B结点后面插入新结点(b)\n");
insertByIndex(list, 2,'b'); //在第一个结点后面插入
printf("遍历单循链表:");
showLinkList(list);
printf("\n修改结点数据(D改为E)\n");
updateNode(list, 5, 'E');
printf("遍历单循链表:");
showLinkList(list);
printf("\n删除结点(E)\n");
deleteNode(list, 5); //删除结点
printf("遍历单循链表:");
showLinkList(list);
printf("\n链表的长度为: %d\n", getLength(list));
return 0;
}