#include <stdio.h>
#include <string.h>
#include <malloc.h>
int count = 0;
struct Student
{
char num[15];
char name[30];
int score;
struct Student *next;
};
struct Student *Head;
struct Student *creatLink(void);
void insert(struct Student *head, int n);
void detel(struct Student *head);
void printLink(struct Student *head);
void menu()
{
int choose, n;
printf("----------------------------------------------------\n");
printf("| 菜单 |\n");
printf("| 1,输入学生成绩。 |\n");
printf("| 2,插入学生成绩。 |\n");
printf("| 3,删除学生。 |\n");
printf("| 4,打印成绩表。 |\n");
printf("| 0,退出。 |\n");
printf("----------------------------------------------------\n");
loop: scanf("%d", &choose);
switch(choose)
{
case 0: system("exit");
break;
case 1: Head = creatLink();
menu();
break;
case 2: printf("请输入在第几项插入元素:\n");
scanf("%d", &n);
insert(Head, n);
menu();
break;
case 3: detel(Head);
menu();
break;
case 4: printLink(Head);
menu();
break;
default: printf("输入错误,请从新输入!!!\n");
goto loop;
break;
}
}
struct Student *creatLink(void)
{
struct Student *head, *stu, *linkTail;
head = linkTail = NULL;
stu = (struct Student*)malloc(sizeof(Student));
printf("输入end结束:\n");
printf("学号 姓名 成绩\n");
scanf("%s", stu->num);
while( strcmp("end", stu->num) )
{
scanf(" %s %d", stu->name, &stu->score);
count++;
if( head == NULL )
{
head = stu;
}
else
{
linkTail->next = stu;
}
linkTail = stu;
stu = (struct Student *)malloc(sizeof(Student));
scanf("%s", stu->num);
}
stu->next = linkTail->next = NULL;
printf("成功创建成绩表,学生人数为:%d\n", count);
return (head);
}
void insert(struct Student *head, int n) //在链表的第n项后插入新的元素
{
struct Student *linkTail, *linkInsert;
int i = 1;
count++;
if( n > count ) n = count;
printf("请输入插入学生的信息:\n");
printf("学号 姓名 成绩\n");
linkInsert = (struct Student*)malloc(sizeof(Student));
scanf("%s %s %d", linkInsert->num, linkInsert->name, &linkInsert->score);
if( n <= 0 || Head==NULL )
{
linkInsert->next = head;
Head = linkInsert;
}
else
{
linkTail = head;
while( i < n )
{
linkTail = linkTail->next;
i++;
}
linkInsert->next = linkTail->next;
linkTail->next = linkInsert;
if( n >= count ) linkInsert->next = NULL;
}
}
void detel(struct Student *head)
{
struct Student *linkTail, *linkHead;
if( head == NULL )
{
printf("成绩表为空,无可删除学生!!!\n");
}
else
{
linkHead = linkTail = head;
count--;
printf("请输入要删除学生的学号:\n");
char num[15];
scanf("%s", num);
while( strcmp(linkTail->num, num)!=0 && linkTail->next!=NULL )
{
linkHead = linkTail;
linkTail = linkTail->next;
}
if( strcmp(linkTail->num, num)!=0 )
printf("对不起,没有查到学号为%s的学生,请检查是否输入有误。\n", num);
else printf("已成功删除学号为%s的学生信息。\n");
if( head == linkTail ) Head = linkTail->next;
else linkHead->next = linkTail->next;
}
}
void printLink(struct Student *head) //打印链表
{
struct Student *last;
last = head;
printf("成绩表为:\n");
printf("学号 姓名 成绩\n");
while( last != NULL )
{
printf("%-10s%-20s%3d\n", last->num, last->name, last->score);
last = last->next;
}
last = NULL;
}
int main()
{
menu();
return 0;
}
分享到:
相关推荐
本文将详细介绍一个基于谭浩强教授的经典程序实现的链表综合操作案例。该程序包含了链表的基本操作,如创建、插入、删除及打印等核心功能。通过本程序的学习与实践,读者可以深入了解链表这一数据结构,并掌握其基本...
链表综合操作.exe
数据结构 c语言 链表的综合操作,增删改查,倒数第k个
在这个"链表综合练习题"中,我们可以深入理解和掌握C语言中链表的基本操作。 首先,我们要理解链表的基本构成。一个链表由多个节点组成,每个节点包含两部分:数据域(存储实际信息)和指针域(存储指向下一个节点...
这个"链表综合算法设计"项目可能涵盖了以上所述的诸多方面,通过实践,可以深入理解链表的内部工作原理,提升C++编程技能,特别是对数据结构和算法的理解。对于学习者而言,这是一个很好的练习平台,有助于在实际...
单向,双向链表的综合操作,包括创建链表,输出链表,节点定位,删除节点,插入节点。
### 链表综合实例详解 #### 一、引言 在计算机科学中,链表是一种常见的线性数据结构,其特点是每个元素由一个存储自身数据的节点和一个指向下一个节点的指针组成。本篇文章将详细介绍如何实现一个简单的单向链表...
本教程将深入探讨C++中的链表操作,包括插入和逆置等常见操作。 一、链表的基本概念 链表由一系列节点组成,每个节点包含两部分:数据域和指针域。数据域存储实际的数据,而指针域则指向下一个节点的地址。链表的首...
在课程设计中,你可能还会涉及到对这些操作的实现优化,比如增加错误检查,提高效率,或者实现更复杂的功能,如反转链表、合并两个有序链表等。理解并熟练掌握这些基本操作,对于进一步学习高级数据结构和算法,如...
【C语言设计链表的综合操作】 链表作为一种基本的数据结构,在C语言中被广泛用于实现各种复杂的数据操作。本报告主要围绕C语言如何设计和操作单链表展开,包括链表的创建、查找、删除等基本操作。下面将详细讨论...
c++ 链表的综合练习 包括建立 删除 插入 显示 指针的作用
在提供的"链表综合操作.cpp"文件中,应该包含了上述操作的C语言实现。代码可能包含结构体定义(如`struct Node`),用于定义链表节点;以及各种函数声明,如`insertAtHead()`,`deleteNode()`,`reverseList()`和`...
《链表的综合操作》(1.3版本).exe
在"链表的综合操作.cpp"中,可能涵盖了链表的基本操作,如创建、插入、删除、遍历和反转链表。这有助于理解动态数据结构的原理和操作。 2. **大数相加相乘**:"大数相加相乘.cpp"涉及到大整数的运算,因为标准C++库...
这是一个数据结构课程设计的程序!里面包含了单链表的所有操作(插入 删除 排序 打印等等)两个链表的运算(交 并 差)!
7. **排序链表**:如果链表中的元素是可比较的,你可以学习如何对链表进行排序,如插入排序、快速排序或归并排序。 8. **链表合并**:在处理多个链表时,可能需要学习如何合并两个或多个已排序的链表。 9. **内存...
在计算机科学中,处理大数阶乘是一项挑战性的任务,...综上所述,通过双向链表实现大数阶乘是一个涉及数据结构、算法和数值计算的综合性问题。理解并实现这个过程不仅有助于提升编程技能,也能深入理解大数运算的原理。
在C++中,我们可以使用结构体或类来表示链表节点,通过指针操作实现插入、删除、遍历等操作。例如,作业可能要求设计一个链表类,包括添加节点、删除特定值的节点以及打印链表内容的方法。 接着,我们讨论多态。...
综上所述,用链表实现STM32的多级菜单是一个涉及数据结构、内存管理、事件处理和用户界面设计等多个方面的综合性任务。通过熟练掌握这些知识点,我们可以创建出高效、易用且可扩展的嵌入式系统用户界面。
实习目的:掌握链式存储结构下线性表的建立及基本操作。 问题:建立一个采用链式存储的线性表,表中元素为学生,每个学生信息包含姓名、学号和成绩三部分,对该表实现:①输出、②查找、③插入、④删除功能,并计算...