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

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数