史上最简单的C语言链表实现,没有之一

简介: #include #include #include #define NR(x) (sizeof(x)/sizeof(x[0]))struct node { int data ; struct node *next ; };void top_append_li...
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define  NR(x)   (sizeof(x)/sizeof(x[0]))

struct node 
{
	int data ; 
	struct node *next ; 
};

void top_append_list(struct node *head , int value);
void print_link(struct node head);
void tail_append_list(struct node *head , int value);
int  delete_link_node(struct node *head , int number);
int  sort_link_node(struct node *head , int flag );    //flag = 1  s->b   0  b->s   
void turn_over_node(struct node *head);

int main(void)
{
	int array[] = {1,2,5,4,3,8,7,6,9};

	struct node head = {.next = NULL} ;  
	struct node *headp ; 

	int i ; 
	for(i = 0 ; i < NR(array) ; i++)
	{
		tail_append_list(&head , array[i]);
	}

	print_link(head);
	int num ; 
	sort_link_node(&head , 1);
	print_link(head);

	//b -> s
	sort_link_node(&head , 0);
	print_link(head);

	turn_over_node(&head);
	print_link(head);

	return 0 ; 
}


void top_append_list(struct node *head , int value)
{
	struct node *New = NULL ; 
	New = malloc(sizeof(struct node));
	if(NULL == New){
		fprintf(stderr , "分配失败!\n");
		return ;
	}	

	New->data = value ; 

	New->next = head->next ; 
	head->next = New ; 
}

void print_link(struct node head)
{
	struct node *tmp = head.next ; 
	while(tmp)
	{
		printf("%d " , tmp->data);
		tmp = tmp->next ; 
	}
	putchar('\n');
}
void tail_append_list(struct node *head , int value)
{
	struct node *New = NULL ; 
	

	New = malloc(sizeof(struct node ));
	if(NULL == New){
		fprintf(stderr , "分配失败!\n");
		return ;
	}
	New->data = value ;  		
	struct node *tmp = head ;   
	while(tmp->next && (tmp = tmp->next)) ; 
	
	
	New->next = tmp->next ; 
	tmp->next = New ; 
}

int  delete_link_node(struct node *head , int number)
{
	struct node *after = head->next , *before = head; 
	int flag = 0 ; 
	while(after)
	{
		if(after->data == number)
		{
			flag = 1 ; 
			before->next = after->next ; 
			after->next = NULL ;
			free(after);
			after = before->next ; 
			continue ; 
		}
		after = after->next; 
		before = before->next ; 
	}
	return flag ; 
}

int  sort_link_node(struct node *head , int flag )    //flag = 1  s->b   0  b->s  
{
	int tmp ; 
	
	struct node *tmp1 , *tmp2 ; 

	tmp1 = head ; 
	while(tmp1 = tmp1->next)
	{
		tmp2 = tmp1->next ; 
		while(tmp2)	
		{
			if((flag==1)?(tmp1->data > tmp2->data):(tmp1->data < tmp2->data))			
			{
				memcpy(&tmp , &tmp1->data , sizeof(int));
				memcpy(&tmp1->data , &tmp2->data , sizeof(int));
				memcpy(&tmp2->data , &tmp , sizeof(int));
			}
			tmp2 = tmp2->next ; 
		}
	}

}

void turn_over_node(struct node *head)
{
	struct node *tmp = head->next ; 
	struct node *cur = NULL; 
	head->next = NULL ; 

	while(cur = tmp)	
	{
		tmp = tmp->next ; 
		cur->next = head->next ; 
		head->next = cur ; 
	}
}

目录
相关文章
|
3月前
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
2天前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
2天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
8天前
|
存储 测试技术 C语言
C语言实现链表的各种功能
本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。
|
28天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
|
2月前
|
存储 数据管理 C语言
C语言实战 | 使用链表完成“贪吃蛇”游戏
【7月更文挑战第1天】整体思维,即系统思维,强调以整体视角理解事物。在编程中,结构体体现这种思想,将相关变量打包处理。示例展示了如何用链表而非数组实现“贪吃蛇”游戏,链表提供了更灵活的动态数据管理。一系列代码图片详细描绘了链表结构体在游戏中的应用,包括节点定义、移动、碰撞检测等,凸显了使用链表的优势和代码的清晰组织。
31 0
C语言实战 | 使用链表完成“贪吃蛇”游戏
|
3月前
|
存储
数据结构——双向链表(C语言版)
数据结构——双向链表(C语言版)
25 2
|
3月前
|
算法 C语言
数据结构——单向链表(C语言版)
数据结构——单向链表(C语言版)
35 2
|
4月前
|
存储 C语言 Python
|
4月前
|
存储 C语言
C语言链表详解 & 两类重要链表的实现
本文详细介绍了链表数据结构,包括链表的非连续、非顺序的物理存储和逻辑顺序通过指针链接的概念。文章以C语言实现链表,并计划更新两种链表(无头单向非循环链表和带头双向循环链表)的代码实现。目前提供了链表的逻辑和物理结构图解,帮助读者理解链表的工作原理,强调了画图在学习数据结构中的重要性。此外,文章指出链表的分类有多种组合形式,并预告将对常用类型的链表进行代码实现。
77 3