方法:运用头尾指针高效建立链表
给出一张学生数据表,如下图所示。请采用链式存储结构建立该学生数据表并输出。
函数接口定义:
struct Student* read_data(); //建立学生信息链表
void output_data(struct Student* head); //输出学生信息
char* find_data(int no, struct Student* head); //查找指定学号的学生姓名
其中 no
为学生学号, head
为链表的头指针。
裁判测试程序样例:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
//此单链表建立更加高效与简洁
//链式存储结构结点类型
struct Student
{
int no; //学号
char name[30]; //姓名
char gendre[30]; //性别
char clazz[30]; //班号
struct Student* next;//指向下一个结点的指针
};
struct Student* read_data(); //建立学生信息链表(核心模块)
void output_data(struct Student* head); //输出学生信息
char* find_data(int no, struct Student* head); //查找指定学号的学生姓名
int main(int argc, char const *argv[])
{
struct Student* head;
head = read_data();
output_data(head);
int no;
scanf("%d", &no);
char* pStr = find_data(no, head);
puts(pStr);
return 0;
}
/* 请在这里填写答案 */
输入样例:
1 张斌 男 9901
8 刘丽 女 9902
34 李英 女 9901
20 陈华 男 9902
12 王奇 男 9901
26 董强 男 9902
5 王萍 女 9901
8
注意:此题目中的输入样例复制到编译器会空格丢失,要测试的话需将输入案例手打到编译器里面,这样才可以成功输出!
输出样例:
1 张斌 男 9901
8 刘丽 女 9902
34 李英 女 9901
20 陈华 男 9902
12 王奇 男 9901
26 董强 男 9902
5 王萍 女 9901
刘丽
执行代码:
struct Student* read_data()
{
struct Student *head,*tail; //此为运用头指针、尾指针更好的建立链表!!!
head = tail = NULL;
struct Student *p;
int x=0;
while(x<7)
{
p = (struct Student*)malloc(sizeof(struct Student));
scanf("%d",&p->no); //此处输入数字和字符串最好分开写
scanf("%s%s%s",p->name,p->gendre,p->clazz);
p->next = NULL;
if(head == NULL)
head = p;
else
tail->next = p;
tail = p;
x++;
}
return head;
}
void output_data(struct Student* head) //不定义结构体指针p也是ok的
{
struct Student *p;
for(p = head;p != NULL;p = p->next)
printf("%d\t%s\t%s\t%s\n",p->no,p->name,p->gendre,p->clazz);
}
char* find_data(int no, struct Student* head) //查找模块,返回类型需注意
{
struct Student* p = head;
while(p!=NULL)
{
if(p->no == no)
return p->name; //返回值为字符串的首地址
p = p->next;
}
return NULL;
}