IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 单链表---实现基本的增删改查功能 -> 正文阅读

[数据结构与算法]单链表---实现基本的增删改查功能

作为掌握C语言基本语法知识之后的拓展延伸,数据结构再合适不过,首先我们将接触到链表的使用。

在此将以 如下程序样例 分段解析 链表的具体使用方法

首先是程序头部分,其包含如下

1-所需头文件

2-宏定义初始链表成员数量

3-定义链表的数据类型

4-声明各类函数

#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define Num 5


typedef struct stu
{
	int num;
	double score;
	struct stu* next;
}Link;

void menu(Link * head);								/*菜单*/
Link* insert(Link *head);							/*增*/
Link* dele(Link* head);								/*删*/
Link* creat(Link* head, int n);						/*创*/
void find(Link* head);								/*查*/
void deplay(Link * head);							/*展示*/

主函数内容简短精炼,只负责初始化链表头节点 , 菜单调用内存释放

/*主函数√*/
int main(void)
{
	Link* head = NULL;
	menu(head); 
		free(head);
	return 0;
}

主要框架交由菜单函数负责? 一个简易的while 循环 与 switch导向 实现各类函数调用与程序的有序执行.

/*菜单√*/
void menu(Link* head)					
{
	int Get;
	int Flag = 2;
	int F = 0;
	while (Flag != EOF)
	{
		if(Flag != 2)
		system("pause");
		system("cls");
		printf("---------------Welcome---------------\n"
				"->1.创建_数据表(成员数为%d)\n"
				"->2.查询_单个成员信息\n"
				"->3.展示_所有成员信息\n"
				"->4.插入_新成员信息\n"
				"->5.删除_某成员信息\n"
				"->0.退出\n"
				"-------------------------------------\n"
				"请输入功能号->>"
				, Num);
		Flag = scanf("%d",&Get);
		switch(Get)
		{
		case 1:
			if (F == 1)
			{
				printf("链表已创建\n");
				break;
			}
			head = creat(head , Num);
			F = 1;
			break;
		case 2:
			if (F == 0)
			{
				printf("链表未创建\n");
				break;
			}
			find(head);
			break;
		case 3:
			if (F == 0)
			{
				printf("链表未创建\n");
				break;
			}
			deplay(head);
			break;
		case 4:
			if (F == 0)
			{
				printf("链表未创建\n");
				break;
			}
			head = insert(head);
			break;
		case 5:
			if (F == 0)
			{
				printf("链表未创建\n");
				break;
			}
			head = dele(head);
			break;
		case 0:
			printf("\nQuit!\n");
			exit(0);
		default:
			printf("error! intput again!\n");
			break;
		}
	}
}

链表创建函数 此处实参(头节点宏定义的成员数量) 初始成员数量 由宏定义来完成? 也可更改为输入流文件流输入 皆可?


/*创√*/
Link* creat(Link* head, int n)
{
	Link* L, * R;
	printf("学员信息录入操作\n");
	for (int i = 1; i <= n; i++)
	{
		printf("请输入第 %d 同学的成绩信息(学号 分数) :",i);
		R = (Link*)malloc(sizeof(Link));
		while ((scanf("%d %lf", &R->num, &R->score)) == EOF)
			printf("输入格式错误 请重新输入->");
		R->next = NULL;
		if (head == NULL)
			head = R;
		else
			L->next = R;
		L = R;
	}
	return head;
}

链表新成员插入函数? 输入流输入新成员数据 并 有序插入到链表中 同时判断重复成员

/*增√*/
Link* insert(Link* head)				
{
	Link* q , *p1 ,*p = head;
	int flag = 1;
	q = (Link*)malloc(sizeof(Link));
	printf("学员信息插入操作");
	printf("请输入添加的学员学号及成绩->");
	while ((scanf("%d %lf", &q->num, &q->score)) == EOF)
	{
		while (p != NULL)
		{
			if (p->num == q->num)
			{
				flag = 0;
				printf("学员学号重复-请重新输入->");
				break;
			}
			p = p->next;
		}
		if (flag == 1)
			break;
		p = head;
	}
	if (head == NULL) //空表填入
	{
		q->next = NULL;
		head = q;
		return head;
	}
	if (head->num > q->num)//插入表头之前
	{
		q->next = head;
		head = q;
		return head;
	}
	p = head;
	p1 = p->next;
	while (p1 != NULL && p1->num < q->num)
	{
		p = p1;
		p1 = p1->next;
	}
	p->next = q;
	q->next = p1;
	return head;
}

链表成员删除函数??

/*删*/
Link* dele(Link* head) 		
{
	Link* p, * p1;
	int flag = 0;
	int num;
	double score;
	printf("学员信息删除操作");
	printf("请输入添加的学员学号及成绩->");
	while ((scanf("%d %lf", &num, &score)) == EOF)
		printf("输入格式错误 请重新输入->");
	p = head;
	p1 = p->next;
	if (num == head->num && score == head->score) // 删除头节点
	{
		head = head->next;
		flag = 1;
		free(p);
		return head;
	}
	while (p1->next!= NULL && num != p1->num)
	{
		p = p1;
		p1 = p1->next;
	}
	if (p1->num != num && flag == 0)
	{
		printf("未找到该学员信息\n");
	}
	else
	{
		p1 = p1->next;
		p->next = p1;	
	}
	return head;
}

链表单个成员信息查询函数? 多种查询方式(学号与成绩)? 并依据输入 进行相应适宜的反馈

/*查√*/
void find(Link * head) 		
{
	int flag;
	int num;
	double score;
	int i = 0;
	Link* p = head;
	printf("---------------学员成绩查询功能---------------\n");
	printf("请选择查询模式:\n"
			"->1.按学号查询\n"
			"->2.按分数查询\n"
			"->");
	while (scanf("%d", &flag) == EOF && flag != 1 && flag != 2)
	{
		printf("输入错误 请重新输入\n->");
	}

	if (flag == 1)
	{
		printf("请输入所需查询的学员学号->");
		while ((scanf("%d",&num)) == EOF)
			printf("输入格式错误 请重新输入->");
		while (p != NULL)
		{
			if (p->num == num)
			{
				printf("num\t   score\n");
				printf("%.3d\t%8.2lf\n", p->num, p->score);
				break;
			}
			else if (p->next == NULL)
				printf("未找到\n");
			p = p->next;
		}
	}
	else if (flag == 2)
	{
		printf("请输入所需查询的学员分数->");
		while ((scanf("%lf", &score)) == EOF)
			printf("输入格式错误 请重新输入->");

		while (p != NULL)
		{
			if (p->score == score)
			{
				i++;
				if (i == 1)
				printf("num\t   score\n");
				printf("%.3d\t%8.2lf\n", p->num, p->score);
			}
			else if (p->next == NULL && i == 0)
				printf("未找到\n");
			p = p->next;
		}
		printf("找到该分数学员共%d人\n",i);
	}
}

链表 遍历展示函数? 遍历链表所有成员 有序输出所有成员信息并打印到屏幕上

/*展示√*/
void deplay(Link* head) 				
{
	Link* p = head;
	printf("num\t   score\n");
	while ( p != NULL)
	{
		printf("%.3d\t%8.2lf\n",p->num,p->score);
		p = p->next;
	}
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:31:37  更:2021-10-09 16:32:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 13:20:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码