一、实验目的及要求
- 进一步理解结构体的概念;
- 掌握结构体的定义和结构体变量的定义和使用方法;
- 能正确使用结构体数组;
- 掌握链表的基本概念,能够编写简单的应用程序
- 进一步提高编程能力。
1.一个班有10名同学,每名同学都有如下信息:学号,姓名,三门课程的成绩。请编写程序输入全班同学的信息,并且按第一门课程的成绩从小到大排序后输出。
5.按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。(要求建立链表、删除用函数)
//5. 按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。
//然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct students {
int num;
char names[30];
char sex[10];
int age;
struct students* next;
}data;
data* setList()
{
data* head = (data*)malloc(sizeof(data));
head->next = NULL;
data* cur = NULL;
data* pt = head;
data students;
int i = 1;
printf("第%d个学生信息:学号 姓名 性别 年龄", i++);
scanf_s("%d %s %s %d", &students.num, students.names,10, students.sex,10, &students.age); //输入数据
while (students.num != 0)
{
cur = (data*)malloc(sizeof(data));
cur->num = students.num;
strcpy_s(cur->names, students.names);
strcpy_s(cur->sex, students.sex);
cur->age = students.age;
cur->next = NULL;
pt->next = cur;
pt = cur;
printf("第%d个学生信息:学号 姓名 性别 年龄", i++);
scanf_s("%d %s %s %d", &students.num, students.names,10, students.sex,10, &students.age); //输入数据
}
return head;
}
void show_List(data* headp)
{
data* headpp = headp->next;
while (headpp != NULL)
{
printf("学号 %d 名字 %s 性别 %s 年龄 %d\n", headpp->num, headpp->names, headpp->sex, headpp->age);
headpp = headpp->next;
}
}
void deleteList(data* head, int age)
{
data* posNode = head->next;
data* posNodeFront = head;
if (posNode == NULL)
{
printf("链表为空");
}
else
{
while (posNode->age != age)
{
posNodeFront = posNode;
posNode = posNodeFront->next;
if (posNode == NULL)
{
printf("没有找到相关信息,无法删除\n");
return;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
void reverse(data* head)
{
data* p = head->next;
data* q = head->next->next;
data* t = NULL;
while (q != NULL)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
q = NULL;
head->next->next = NULL;
head->next = p;
}
int main(int argc, char const* argv[]) {
//头节点
data* headnode = (data*)malloc(sizeof(data));
//创建链表
headnode = setList();
show_List(headnode);
//删除链表
int age;
printf("请输入一个年龄:");
scanf_s("%d", &age);
deleteList(headnode, age);
printf("进行了删除链表数据的操作之后的数据:\n");
show_List(headnode);
//链表逆序
printf("以下是逆序后的数据:");
reverse(headnode);
show_List(headnode);
return 0;
}