#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data ; // 实际数据的存放位置
struct node *next; // link_t *next ; 注意由于编译器解析问题, 此时编译器还不知道link_t 是什么类型 .
/* 指向链表中下一个结点的地址 .
* */
}link_t ;
//创建
link_t *creat_link()
{
//1.申请头结点的空间
link_t *head = malloc(sizeof(link_t));
//2.初始化头结点
head->next = NULL ;
//3.返回头结点的地址
return head;
}
//从头增加
int ins_head_link(link_t *head, int data)
{
//1.申请新的结点空间 .
link_t *newnode = malloc(sizeof(link_t));
//2.写入数据
newnode->data = data ;
//3.新结点指向0号元素
newnode->next = head->next;
//4.头结点指向新的结点
head->next = newnode ;
return 0;
}
//判空
int isnull(link_t *head)
{
if(head == NULL)
return 0;
return head->next == NULL ;
}
//从头删除
int del_head_link(link_t *head)
{
//1.备份要删除的结点
link_t *temp ;
temp = head->next;
//2.头结点指向下一个结点 .
head->next = head->next->next ;
// head->next = temp->next;
//3.释放要删除结点的存储空间 .
free(temp);
return 0;
}
//指定位置增加
int ins_index_link(link_t *head, int index, int data)
{
if(index < 0)
return -1;
#if 0
//确定位置
while(index--)
{
head = head->next;
if(head == NULL)
return -1;
}
#endif
int i;
for(i = index; i > 0; i--)
{
head = head->next;
if(head == NULL)
return -1;
}
//增加数据
ins_head_link(head, data);
return 0;
}
//指定位置删除
int del_index_link(link_t *head, int index)
{
if(index < 0)
return -1;
//确定位置
while(index--)
{
head = head->next;
if(head->next == NULL)
return -1;
}
del_head_link(head);
return 0;
}
//改 指定位置修改数据
int change_index_link(link_t *head, int index, int data)
{
while(index--)
{
head = head->next;
if(head->next == NULL)
return -1;
}
head->next->data = data ;
return 0;
}
/* 查 : 1 .返回结点地址 比 第几个结点 方便 .
* 2. 返回查找位置的前一个结点的地址 比 返回本结点的地址方便 .
* */
link_t *locate_link(link_t *head, int data)
{
while(head->next != NULL)
{
if(head->next->data == data)
return head;
head = head->next;
}
}
int print_link(link_t *head)
{
head = head->next ;
while(head != NULL)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
return 0;
}
//清空表
void clean_link(link_t *head)
{
printf("清除\n");
while(head->next != NULL)
{
del_head_link(head);
}
}
//销毁表
void destroy_link(link_t *head)
{
clean_link(head);
free(head);
}
int main(int argc, const char *argv[])
{
link_t *link ;
link = creat_link();
int i;
for(i = 1; i<=10; i++)
{
ins_head_link(link, i*10);
print_link(link);
}
printf("*********分割线************\n");
for(i = 1; i <= 3; i++)
{
del_head_link(link);
print_link(link);
}
ins_index_link(link, 4, 666);
print_link(link);
del_index_link(link, 4);
print_link(link);
del_index_link(link, 6);
print_link(link);
change_index_link(link, 4, 7777);
print_link(link);
link_t *ret = locate_link(link, 7777);
del_head_link(ret);
print_link(link);
clean_link(link);
print_link(link);
destroy_link(link);
return 0;
}
C语言自学链表,单向链表,双向链表,适合新手学习。
需积分: 46 62 浏览量
2019-06-18
09:41:13
上传
评论 2
收藏 2KB RAR 举报
wjswlal
- 粉丝: 10
- 资源: 19
最新资源
- 徐州市区shp边界文件
- 简易数字频率计设计(原理图、PCB、源码、分析报告)
- 20225207038罗丽文财管专2201班.rar
- Golang:通过Gin框架+Redis+责任链,实现一个简单的钉钉机器人,进行消息处理 ps:多应用版
- 基于cnn和AlexNet的铝材缺陷检测内含数据集和demo原型2种方法
- 2023年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
- go 语言 实现的 使用modbus 协议 通过DTU tcp 链接 采集数据
- SHELL脚本(全是干货)
- Windows屏幕录屏软件
- 2022年各城市PM2.5, PM10, SO2, NO2等环境空气质量数据
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈