C语言实现链表(非常简单实用)

 下面是用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);		
}

代码运行结果

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值