链式表的实现

链式表(链表) list

1、数据元素(节点)的数据项

①数据域:可以是各种类型的若干项数据项

②指针域:指向下一个节点的指针

2、由若干个节点通过指针域连接起来就形成了链表
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TYPE int

//	设计链表的节点结构
typedef struct Node
{
   
	TYPE data;			//	节点的数据域
	struct Node* next;	//	节点的指针域
}Node;

//	创建节点
Node* create_node(TYPE data)
{
   
	//	申请节点的内存
	Node* node = malloc(sizeof(Node));
	node->data = data;
	node->next = NULL;
	return node;
}

//	头添加
void add_head_list(Node** head,TYPE data)
{
   
	//	创建待添加的节点
	Node* node = create_node(data);
	node->next = *head;
	*head = node;
}

//	按值删除
bool del_value_list(Node** head,TYPE data)
{
   
	if((*head)->data == data)
	{
   
		Node* temp = *head;
		*head = (*head)->next;
		free(temp);
		return true;
	}
	//	遍历找到待删除节点的前一个节点
	for(Node* n=*head; n->next; n=n->next)
	{
   
		if(n->next->data == data)
		{
   
			Node* temp = n->next;
			n->next = n->next->next;
			free(temp);
			return true;
		}
	}
	return false;
}

//	遍历链表
void show_list(Node* head)
{
   
	for(Node* n=head; n; n=n->next)
	{
   
		printf("%d ",n->data);	
	}
	printf("\n");
}

//	访问
bool access_list(Node* head,size_t index,TYPE* data)
{
   
	int i = 0;
	for(Node* n = head; n; n=n->next,i++)
	{
   
		if(i == index) 
		{
   
			*data = n->data;
			return true;
		}
	}
	return false;
}

//	排序
void sort_list(Node* head)
{
   
	for(Node* i=head; i->next; i=i->next)
	{
   
		for(Node* j=i->next; j; j=j->next)
		{
   
			if(j->data < i->data)
			{
   
				TYPE temp = j->data;
				j->data = i->data;
				i->data = temp;
			}
		}
	}
}

//	按位置删除
bool del_index_list(Node** head,size_t index)
{
   
	if(0 == index)
	{
   
		Node* temp = *head;
		*head = temp->next;
		free(temp);
		return true;
	}

	Node* n = *head;
	for(int i=1; n->next; n=n->next,i++)
	{
   
		if(i == index)
		{
   
			Node* temp = n->next;
			n->next = temp->next;
			free(temp);
			return true;
		}
	}
	return false;
	/*
	while(--index)
	{
		n = n->next;
		if(NULL == n) return false;
	}

	if(NULL == n->next) return false;
	Node* temp = n->next;
	n->next = temp->next;
	free(temp);
	*/
	return true;
}


int main(int argc,const char* argv[])
{
   
	Node* head = create_node(10);

	for(int i=0; i<5; i++)
	{
   
		add_head_list(&head,i+1);	
	}
	show_list(head);
	del_value_list(&head,100);
	show_list(head);
	int num = 0;
	access_list(head,20,&num);
	printf("num=%d\n",num);
	sort_list(head);
	show_list(head);
	del_index_list(&head,2);
	show_list(head);

	/*	理解链表的本质
	Node* n1 = create_node(10);
	Node* n2 = create_node(20);
	Node* n3 = create_node(30);
	Node* n4 = create_node(40);
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;

	for(Node* n=n1; n; n = n->next)
	{
		printf("%d ",n->data);	
	}
	*/
}

相关推荐

  1. 实现

    2023-12-20 05:02:01       31 阅读
  2. 双向实现

    2023-12-20 05:02:01       19 阅读
  3. 双向实现

    2023-12-20 05:02:01       16 阅读
  4. 实现

    2023-12-20 05:02:01       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 05:02:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 05:02:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 05:02:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 05:02:01       18 阅读

热门阅读

  1. Docker使用7-Use Docker Compose

    2023-12-20 05:02:01       56 阅读
  2. 【嵌入式面试】嵌入式经典面试题汇总(C语言)

    2023-12-20 05:02:01       33 阅读
  3. Python基础dict字典定义与函数

    2023-12-20 05:02:01       38 阅读
  4. 【SpringBoot实战】基于MybatisPlus实现基本增删改查

    2023-12-20 05:02:01       51 阅读
  5. 【安全】audispd调研

    2023-12-20 05:02:01       38 阅读
  6. C#连接数据库40错误

    2023-12-20 05:02:01       39 阅读
  7. 64道Go机制高频题整理(附答案背诵版)

    2023-12-20 05:02:01       40 阅读
  8. 【周志华机器学习】学习笔记一:绪论

    2023-12-20 05:02:01       32 阅读
  9. Debian系统设置SSH密钥登陆

    2023-12-20 05:02:01       38 阅读
  10. 本地声明式缓存

    2023-12-20 05:02:01       35 阅读