一、实验目的及要求
- 进一步理解结构体的概念;
- 掌握结构体的定义和结构体变量的定义和使用方法;
- 能正确使用结构体数组;
- 掌握链表的基本概念,能够编写简单的应用程序
- 进一步提高编程能力。
1.一个班有10名同学,每名同学都有如下信息:学号,姓名,三门课程的成绩。请编写程序输入全班同学的信息,并且按第一门课程的成绩从小到大排序后输出。
5.按照输入的顺序建立一个链表,每个节点包括:学号、姓名、性别、年龄。直到输入的学号为-1结束。然后输出此链表。然后从键盘上输入一个学生的学号,把此学生的节点删除后再输出链表。(要求建立链表、删除用函数)
6.修改5题的建立链表的函数,要求按照输入的逆序建立链表。其他不变。
// filename: 建立一个链表,每个节点包括:学号,姓名,性别以及年龄,
// 输入一个链表,如果链表中的节点所包含的年龄等于此年龄,
//则将此节点删去
#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("%d %s %s %d", &students.num, students.names, students.sex, &students.age); //输入数据
while (students.num !=-1 )
{
cur = (data *)malloc(sizeof(data));
cur->num = students.num;
strcpy(cur->names,students.names);
strcpy(cur->sex,students.sex);
cur->age=students.age;
cur->next = NULL;
pt->next = cur;
pt = cur;
printf("第%d个学生信息:",i++);
scanf("%d %s %s %d", &students.num, students.names, students.sex, &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("%d",&age);
deleteList(headnode,age);
printf("进行了删除链表数据的操作之后的数据:\n");
show_List(headnode);
//链表逆序
printf("以下是逆序后的数据:");
reverse(headnode);
show_List(headnode);
return 0;
}