动态链表之创建链表(头插法)
创建链表,并采用头插法将新结点插入到head之后,输入完整的学生数据,构建动态链表。
算法工作示意图:
#include <stdio.h>
#include <stdlib.h>
struct Student
{
char name[20];
long num;
float grades[5];
struct Student *next;
};
typedef struct Student STU;
int main()
{
STU *head, *p;
int num;
// 初始化head结点
head = (STU *) malloc (sizeof(STU));
head->next = NULL;
// 插入法输入链表数据
printf("请输入学号(小于或等于0则结束输入)");
scanf("%ld", &num);
while(num > 0)
{
p = (STU *) malloc (sizeof(STU));
// 输入数据
p->num = num;
printf("请输入姓名:");
scanf("%s", p->name);
printf("请输入5门课的成绩(以空格分隔):");
for (int i = 0; i < 5; i++)
scanf("%f", &p->grades[i]);
// 建立链表关联
p->next = head->next;
head->next = p;
// 继续输入下一个num
printf("请输入学号(小于或等于0则结束输入)");
scanf("%ld", &num);
}
// 遍历(访问)链表数据
p = head->next;
printf("学号\t姓名\t成绩\n");
while (p != NULL)
{
printf("%ld\t%s\t%.1f\n",
p->num, p->name, p->grades[0]); // 只输入1门课成绩
p = p->next; // 意义上与p++相似,语法上不一样
}
return 0;
}