C //习题 9.8 写一个函数insert,用来向一个动态链表插入结点。

2023-12-01 09:15

本文主要是介绍C //习题 9.8 写一个函数insert,用来向一个动态链表插入结点。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C程序设计 (第四版) 谭浩强 习题9.8

习题 9.8 写一个函数insert,用来向一个动态链表插入结点。

IDE工具:VS2010
Note: 使用不同的IDE工具可能有部分差异。

 

代码块:
由于链表是动态链表,不能按照结构体变量为数组的时候通过指针增减调整指针指向,借鉴网上的提示,将原来的单链表增加一个结构体内指针,成为双向链表。
方法:使用指针,自定义类型,结构体,动态分配内存,函数返回类型调整为空。
#include <stdio.h>
#include <stdlib.h>typedef struct Student{int num;float score;Student *prev;Student *next;
}Student;void initialStu(Student **stu){int *n = (int*)malloc(sizeof(int));//输入要建立的学生人数printf("Enter the number of students: ");scanf("%d", n);while(*n <= 0){printf("Number can't less or equal than 0!\nEnter the number of students: ");scanf("%d", n);}printf("\n");//创建头结点,头结点的num指定为学生总人数Student *head = (Student*)malloc(sizeof(Student));head->num = *n;head->next = NULL;*stu = head;n = NULL;free(n);
}//判断学生编号是否重复
int isRepeat(Student *stu, int num){for(Student *p = stu->next; p != NULL; p = p->next){if(p->num == num){return 1;}}return 0;
}void creatStu(Student *stu){Student *head = stu;Student *p1 = head;Student *p2 = head;printf("Enter %d students info:\n\n", head->num);for(int i = 0; i < head->num; i++){p1 = (Student*)malloc(sizeof(Student));p1->next = NULL;p1->prev = p2;printf("Enter No.%d student number(100 ~ 999): ", i + 1);scanf("%d", &p1->num);while(p1->num < 100 || p1->num > 999 || isRepeat(stu, p1->num) == 1){if(isRepeat(stu, p1->num) == 1){printf("Number Repeat! ");}else{printf("Number Error! ");}printf("Retry!\nEnter No.%d student number(100 ~ 999): ", i + 1);scanf("%d", &p1->num);}printf("Enter No.%d student score(0 ~ 100): ", i + 1);scanf("%f", &p1->score);while(p1->score < 0 || p1->score > 100){printf("Score Error! Retry!\nEnter No.%d student score(0 ~ 100): ", i + 1);scanf("%f", &p1->score);}p2->next = p1;p1 = p1->next;p2 = p2->next;printf("\n");}
}void printStu(Student *stu){printf("\nThe info of %d students:\n", stu->num);for(Student *p = stu->next; p != NULL; p = p->next){printf("Number: %-4d  Score: %-6.2f\n", p->num, p->score);}printf("\n");
}void insertStu(Student *stu){Student *newStu = (Student*)malloc(sizeof(Student));printf("Enter new student info:\n\n");printf("Enter new student number(100 ~ 999): ");scanf("%d", &newStu->num);while(isRepeat(stu, newStu->num) == 1){printf("Number Repeat! Retry!\nEnter new student number(100 ~ 999): ");scanf("%d", &newStu->num);}while(newStu->num < 100 || newStu->num > 999 || isRepeat(stu, newStu->num) == 1){if(isRepeat(stu, newStu->num) == 1){printf("Number Repeat! ");}else{printf("Number Error! ");}printf("Retry!\nEnter new student number(100 ~ 999): ");scanf("%d", &newStu->num);}printf("Enter new student score(0 ~ 100): ");scanf("%f", &newStu->score);while(newStu->score < 0 || newStu->score > 100){printf("Score Error! Retry!\nEnter new student score(0 ~ 100): ");scanf("%f", &newStu->score);}printf("\n");//采用头结点后插入新结点Student *head = stu;newStu->next = head->next;head->next->prev = newStu;head->next = newStu;newStu->prev = head;
}int main(){Student *stu = NULL;initialStu(&stu);creatStu(stu);printStu(stu);insertStu(stu);printStu(stu);free(stu);system("pause");return 0;
}

这篇关于C //习题 9.8 写一个函数insert,用来向一个动态链表插入结点。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/440572

相关文章

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序