7.4 单循环链表
循环链表基本操作
创建
判断非空
添加节点
删除节点
遍历
代码
/*************************************
* 名称描述:单向循环链表
* 实现功能:单向循环链表基本操作:
添加、删除、遍历
* 作 者:王 利 涛
* QQ 群 :475504428
* 公 众 号:宅学部落(armlinuxfun)
* 嵌入式自学路线咨询 QQ:3284757626
*************************************/
#include<stdio.h>
#include<stdlib.h>
struct list_node{
int data;
struct list_node *next;
};
int is_list_empty(struct list_node *head)
{
return (head->next == head);
}
void list_print(struct list_node *head)
{
struct list_node *p;
p = head->next;
for(p;p!=head;p=p->next)
printf("p->data = %d\n",p->data);
}
void list_free(struct list_node *head)
{
struct list_node *p,*q;
q = head->next;
p = q->next;
while(q!=head){
free(q);
q = p;
if(p!=head)
p = p->next;
printf("p:%p q:%p\n",p,q);
};
}
void list_add(struct list_node *head,struct list_node *node)
{
node->next = head->next;
head->next = node;
}
void list_add_tail(struct list_node *head,struct list_node *node)
{
struct list_node *p;
for(p=head->next;p->next!=head;p=p->next);
p->next = node;
node->next = head;
}
int list_delete(struct list_node *head,struct list_node *node)
{
struct list_node *p;
if(head->next == head)
{
printf("empty list!\n");
return -1;
}
for(p=head->next;p->next!=node;p=p->next)
{
if(p == head)
{
printf("find no node!\n");
return -2;
}
if(p == node)
{
head->next = node->next;
free(node);
}
}
p->next = node->next;
free(node);
return 0;
}
struct list_node *list_foreach(struct list_node *head,int val)
{
struct list_node *p;
p = head->next;
if(p == head)
{
printf("empty list!\n");
return (struct list_node*)0;
}
for(p;p->data!=val;p=p->next)
{
if(p == head)
{
printf("find no node!\n");
return (struct list_node*)0;
}
}
return p;
}
int main(void)
{
struct list_node *p;
struct list_node listhead,*head;
head = &listhead;
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 1;
printf("%d\n",p->data);
head->next = p;
p->next = head;
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 2;
p->next = NULL;
list_add(head,p);
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 3;
p->next = NULL;
list_add(head,p);
p = (struct list_node*)malloc( sizeof(struct list_node));
p->data = 4;
p->next = NULL;
list_add_tail(head,p);
list_delete(head,head->next);
list_print(head);
p = list_foreach(head,4);
printf("%d\n",p->data);
// list_free(head);
return 0;
}
···