使用示例
带头结点的单链表请参见:
[C语言实现常用数据结构:带头结点的单链表(第3篇)(https://www.jianshu.com/p/ffd75e7e0272)
功能:输入数据个数和数据,逆序保存到顺序表,并逆序输出显示到屏幕。
运行结果如下:
请输入数据总个数:10
请依次输入10个整数:0 1 2 3 4 5 6 7 8 9
单链表输出结果:9 8 7 6 5 4 3 2 1 0
单链表删除5位置数据后输出结果:9 8 7 6 4 3 2 1 0
代码实现:不带头点的单链表
*/
#include <stdio.h>
#include <stdlib.h>
// 定义单链表数据结构
typedef struct list_node
{
int data;
struct list_node *next;
}list_node;
// 增加
int insert_link_list(list_node **list, int data)
{
if(list == NULL)
return -1;
list_node *node = (list_node *)malloc(sizeof(list_node));
// 分配内存失败
if(node == NULL)
return -1;
node->data = data;
node->next = NULL;
// 对于空表特殊处理
if(*list == NULL)
{
*list = node;
}else
{
// 头插法插入
// 输出顺序和输入相反
node->next = *list;
*list = node;
}
return 0;
}
// 删除指定位置
int delete_link_list(list_node **list, int *data, int pos)
{
if(list==NULL || pos < 1)
return -1;
// 空表
if(*list == NULL)
return -1;
list_node *p = *list;
// 如果删除的是第一个位置元素
if(pos == 1)
{
*list = (*list)->next;
free(p);
}else
{
// 循环找到要删除的元素前一个位置
int i;
for(i=1; i < pos-1 && p != NULL; i++)
p = p->next;
// 找到该位置
if(i==pos-1 && p != NULL)
{
list_node *q = p->next;
if(q != NULL)
{
*data = q->data;
p->next = q->next;
free(q);
}
}else
{
return -1;
}
}
return 0;
}
// 查看
void print_link_list(list_node *list)
{
if(list != NULL)
{
list_node *p = list;
while(p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
}
// 销毁
void free_link_list(list_node **list)
{
if(list != NULL)
{
list_node *p = *list;
while(p != NULL)
{
*list = p->next;
free(p);
}
*list = NULL;
}
}
int main(void)
{
list_node *list = NULL;
int n,d;
printf("请输入数据总个数:");
scanf("%d", &n);
printf("请依次输入%d个整数:", n);
int i;
for(i=0; i<n; i++)
{
scanf("%d", &d);
// 每次插入到链表首位,这样实现倒序
insert_link_list(&list, d);
}
printf("单链表输出结果:");
print_link_list(list);
printf("单链表删除%d位置数据后:",n/2);
delete_link_list(&list, &d, n/2);
print_link_list(list);
free_link_list(&list);
return 0;
}
其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。
网友评论