史上最简单的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 ; 
	}
}

目录
相关文章
C语言里的循环链表
C语言里的循环链表
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
4065 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
542 5
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1670 4
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
182 0
|
C语言
C语言链式结构之有头单链表再封装写法
本文介绍了如何使用C语言对有头单链表进行封装,包括节点的创建、链表的初始化、数据的插入和删除,以及链表的打印等功能。
196 1
|
C语言
C语言结构体链式结构之有头单链表
文章提供了一个C语言实现的有头单链表的完整代码,包括创建链表、插入、删除和打印等基本操作。
277 1
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
452 0
单链表之无头链表(C语言版)
|
存储 测试技术 C语言
C语言实现链表的各种功能
本文详细介绍了如何使用C语言实现链表的各种功能,包括链表节点结构的定义与操作函数的实现。链表作为一种常用的数据结构,具有节点自由插入删除、动态变化等特点。文中通过`link_list.h`和`link_list.c`两个文件,实现了链表的初始化、插入、删除、查找、修改等核心功能,并在`main.c`中进行了功能测试。这些代码不仅展示了链表的基本操作,还提供了丰富的注释帮助理解,适合作为学习链表的入门资料。