实现功能:
- 单循环链表的创建
- 单循环链表的插入(头插法、尾插法)
- 单循环链表的删除
- 单循换链表的遍历
代码实现:
//单循环链表
#include <stdio.h>
#include <stdlib.h>
//定义链表节点的结构体
typedef struct node_st
{
int data; //数据域
struct node_st *next; //指针域
}list;
/*函数声明部分*/
list *list_create(); //创建链表
void list_insert_h(list *head,int data);//头部插入
void list_insert_t(list *head,int data); //尾部插入
int list_delete(list *head,int data); //链表删除
void list_print(list *head); //链表打印
int main()
{
list *head = list_create();
list_insert_h(head,1);
list_insert_h(head,2);
list_insert_h(head,3);
list_insert_t(head,4);
list_insert_t(head,5);
list_print(head);
list_delete(head,3);
list_print(head);
return 0;
}
/*函数实现部分*/
//创建单循环链表
list *list_create()
{
list *head = malloc(sizeof(list));//申请内存空间
head->data = 0; //存放有效节点的个数
head->next = head; //指向自己
return head; //返回头指针
}
//头部插入:插在头节点的后面
void list_insert_h(list *head,int data)
{
list *new = malloc(sizeof(list));
new->data = data; //插入的数据
new->next = head->next;//新节点和头节点都指向同一后继
head->next = new; //使新节点成为头节点的后继
head->data++; //有效节点数加1
}
//尾部插入:插在头节点的前面,尾节点的后面
void list_insert_t(list *head,int data)
{
list *node = head;//用node代替头节点操作
list *new = malloc(sizeof(list));//为新节点申请内存空间
new->data = data; //插入的数据
//判断下一个节点是否是头节点
while(node->next!=head)
{
node = node->next;
}
new->next = head; //使得新节点是头节点的前驱
node->next = new; //新节点是尾节点的后继
head->data++; //有效节点数加1
}
//链表删除
int list_delete(list *head,int data)
{
list *pre_node = head; //待删除节点的前驱节点
list *node = head->next; //待删除的节点
while(node != head) //待删除节点不是头节点
{
if(node->data==data)//节点的数据与指定删除的数据一样
{
pre_node->next = node->next;//指针跳过删除节点
free(node); //释放内存
head->data--; //有效节点数减1
return 1; //返回删除成功
}
//继续往下找
pre_node = node;
node = node->next;
}
return 0; //删除失败
}
//链表遍历
void list_print(list *head)
{
list *node = head->next;//有效节点
while(node != head) //当前节点不是头节点
{
printf("%d->",node->data);
node = node->next;
}
printf("NULL\n");
}
运行结果: