一、什么是循环单链表?
就是尾节点的next指针域存放的是头节点的地址
二、需要使用的函数?
1、必备函数
(1)判断链表是否为空
(2)判断addr是否在链表中
(3)求链表长度
(4)定位到addr的前一个节点
(5)新建一个节点
(6)增加一个节点
(7)删除一个节点
2、基础函数
(1)初始化链表
(2)根据元素返回addr
(3)插入一个新的元素
(4)遍历链表
(5)删除指定元素
//3、插入一个新的元素
Status insert_elem(LinkedList head, int addr, ElemType elem){
//2、新建一个节点
Node * pNew = new_node();
pNew->data = elem;
//3、定位
Node * temp = locat_before_node(head, addr);
//4、插入节点
insert_node(temp,pNew);
return Ok;
}
//4、遍历链表
void traverse_list(LinkedList head){
Node * temp = head->next;
while (temp){
if (temp == head)
break;
printf("%-4d",temp->data);
temp = temp->next;
}
printf("\n");
}
三、总结
单循环链表和单链表的操作是相似的,唯一的区别就是插入元素、遍历元素
1、掌握基础函数
2、掌握必备函数
3、熟悉循环单链表 和 单链表在基础操作上的区别
四、代码
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define ElemType int
#define Status int
#define Error 0
#define Ok 1
typedef struct node{
ElemType data;
struct node * next;
}Node, * LinkedList;
bool isEmpty(LinkedList head){
if(head->next == head){
printf("The list is empty\n");
return true;
}
return false;
}
int length_list(LinkedList head){
Node * temp = head->next;
int length = 0;
if (temp != head)
{
while(temp){
length++;
temp = temp->next;
if (temp == head)
{
break;
}
}
}
return length;
}
bool isBetween(LinkedList head, int addr){
if (addr<1 || addr>length_list(head))
{
printf("The addr is not in the list!\n");
return false;
}
return true;
}
Node * new_node(){
Node * node = (Node *)malloc(sizeof(Node));
if (node == NULL)
{
printf("Failed to create node\n");
exit(1);
}
node->next = NULL;
return node;
}
void insert_node(Node * before_node, Node * after_node){
after_node->next = before_node->next;
before_node->next = after_node;
}
void delete_node(Node * before_node, Node * after_node){
if (before_node->next->next == before_node)
{
before_node->next = NULL;
before_node->next = before_node;
free(after_node);
}else{
Node * temp = after_node;
before_node->next = after_node->next;
free(after_node);
}
}
Node * locat_before_node(LinkedList * head, int addr){
Node * temp = head;
for (int i = 1; i < addr; i++)
{
temp = temp->next;
}
return temp;
}
Node * init_list(){
Node * head = (Node *)malloc(sizeof(Node));
if (head == NULL)
{
printf("Initialization failed!\n");
exit(1);
}
head->next = head;
return head;
}
int search_by_elem(LinkedList head, ElemType elem){
if(isEmpty(head)){
return 0;
}
Node * temp = head->next;
int addr = 1;
while (temp)
{
if (temp == head)
{
printf("The element is not in the list!\n");
return 0;
}
if (temp->data == elem)
{
return addr;
}
temp = temp->next;
addr++;
}
return 0;
}
Status insert_elem(LinkedList head, int addr, ElemType elem){
Node * pNew = new_node();
pNew->data = elem;
Node * temp = locat_before_node(head, addr);
insert_node(temp,pNew);
return Ok;
}
void traverse_list(LinkedList head){
Node * temp = head->next;
while (temp){
if (temp == head)
break;
printf("%-4d",temp->data);
temp = temp->next;
}
printf("\n");
}
Status delete_elem(LinkedList head, ElemType elem){
if (isEmpty(head)){
return Error;
}
int addr = search_by_elem(head, elem);
Node * temp = locat_before_node(head,addr);
delete_node(temp,temp->next);
return Ok;
}
int main(void){
Node * head = init_list();
insert_elem(head,1,1);
insert_elem(head,2,2);
insert_elem(head,3,3);
insert_elem(head,4,5);
traverse_list(head);
delete_elem(head,1);
traverse_list(head);
}