# include <stdio.h>
# include <stdlib.h>
/**
* 循环单链表
* 初始化
* 插入元素
* 删除元素
* 求链表总长
* @return
*/
typedef int E;
struct ArrayNode{
E e;
struct ArrayNode * next;
};
typedef struct ArrayNode * Node;
//初始化链表
_Bool initNode(Node head){
head -> next = head;
return 1;
}
//插入
_Bool insertNode(Node head,E e,int index){
if(index < 1) return 0;
Node tmp;
tmp = head;
while(--index){
head = head -> next;
if(head == tmp) return 0;
}
//此时head是待插入位置的前驱节点
Node node = malloc(sizeof(struct ArrayNode));
if(node == NULL) return 0;
node -> e = e;
node -> next = head -> next;
head -> next = node;
return 1;
}
//删除
_Bool deleteNode(Node head,int index){
Node tmp = head;
if(index < 1) return 0;
while(--index){
head = head -> next;
if(head == tmp) return 0;
}
if(head -> next == tmp) return 0;
Node node = head -> next;
head -> next = head -> next -> next;
free(node);
return 1;
}
//求链表总长
int longNode(Node head){
int count = 0;
Node tmp;
tmp = head;
head = head -> next;
while(head != tmp){
count++;
head = head -> next;
}
return count;
}
//打印链表
void printNode(Node head){
Node tmp;
tmp = head;
head = head -> next;
while(head != tmp){
printf("%d ",head -> e);
head = head -> next;
}
// free(tmp);
printf("\n");
}
int main(){
struct ArrayNode head;
initNode(&head);
printf("初始化成功!\n");
for(int i = 0; i < 10;i++){
insertNode(&head,(i+1)*10,i+1);
}
printNode(&head);
printf("链表总长:%d\n", longNode(&head));
//末尾添加元素
insertNode(&head,11,11);
printNode(&head);
//删除链表元素
deleteNode(&head,11);
printNode(&head);
}
循环单链表(C语言)
最新推荐文章于 2024-10-09 21:14:39 发布