下面是用C语言实现一个简单的链表代码,适合C语言入门的小伙伴可以参考学习,通过这些代码可以对C语言链表有个很直观的理解,代码中还存在很多的瑕疵,比如添加和删除节点中没有进行处理超过本身链接节点数的添加,还有指针的处理还有改善的空间等等,还有链表十分简单的就只能从链表头向下找节点,属于单向链表。可以进行扩展作成一个双向链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct linked_list //链表节点数据结构体
{
int date; //数据
void *next; //用来存储下个链表节点的地址
}link;
void insert_link(link *link_list, int data); //在链表结尾添加链表节点
void delete_link(link *link_list); //在链表结尾删除链表节点
void add_link(link *link_list, int date, int n); //在链表的n节点 添加链表节点
void reduce_link(link *link_list, int n);//在链表的n节点 删除某个链表节点
int main() {
int i = 0;
link linked_head; //链表的头地址
link *replace_link ; //用于作为打印输出的链表指针
linked_head.date = 0; //链表头初始化
linked_head.next = (void *)NULL;
insert_link(&linked_head, 20); //链表添加节点 (在链表尾添加)
insert_link(&linked_head, 30);
insert_link(&linked_head, 40);
insert_link(&linked_head, 50);
insert_link(&linked_head, 60);
insert_link(&linked_head, 70);
replace_link = &linked_head;
printf("\n"); //打印链表的数据
do
{
replace_link = replace_link->next;
printf("function link%d = %d\n", i++, replace_link->date);
}while(replace_link->next != NULL);
delete_link(&linked_head); //链表删除节点( 在链尾删除)
replace_link = &linked_head;
printf("\n"); //打印链表的数据
do
{
replace_link = replace_link->next;
printf("function link%d = %d\n", i++, replace_link->date);
}while(replace_link->next != NULL);
add_link(&linked_head, 100, 1); //在链表某个节点添加链表节点
replace_link = &linked_head;
printf("\n");//打印链表的数据
do
{
replace_link = replace_link->next;
printf("function link%d = %d\n", i++, replace_link->date);
}while(replace_link->next != NULL);
reduce_link(&linked_head, 3); //在链表某个节点删除链表节点
replace_link = &linked_head;
printf("\n");//打印链表的数据
do
{
replace_link = replace_link->next;
printf("function link%d = %d\n", i++, replace_link->date);
}while(replace_link->next != NULL);
return 0;
}
/*在链表结尾添加链表节点 */
void insert_link(link *link_list , int data)
{
link *replace_link = link_list;
while(replace_link->next != NULL) //判断是否到链表结尾
{
replace_link = replace_link->next;
}
/*
* 向系统申请一个大小为 link结构体大小内存
* 用来作为新的链表节点
*/
replace_link->next = malloc(sizeof(link));
replace_link = replace_link->next;
replace_link->date = data;
replace_link->next = NULL;
}
/*在链表结尾删除链表节点 */
void delete_link(link *link_list)
{
link *replace_link = link_list;
link *clean_link = link_list;
while(replace_link->next != NULL)
{
clean_link = replace_link;
replace_link = replace_link->next;
}
clean_link->next = (void *)NULL;
free(replace_link); //释放链表节点内存
}
/* 在链表的n节点 添加链表节点 */
void add_link(link *link_list, int date, int n)
{
int i;
link *replace_link = link_list;
link *add_link;
for(i = 0; i < n; i++) //循环到链表的第N个节点
{
replace_link = replace_link->next;
}
add_link = replace_link->next;
replace_link->next = malloc(sizeof(link));
replace_link = replace_link->next;
replace_link->date = date;
replace_link->next = add_link;
}
/* 在在链表的n节点 删除某个链表节点 */
void reduce_link(link *link_list, int n)
{
int i;
link *replace_link = link_list;
link *reduce_link;
for(i = 0; i < n; i++)
{
reduce_link = replace_link;
replace_link = replace_link->next;
}
reduce_link->next = replace_link->next;
free(replace_link);
}
代码运行结果