永发信息网

用C语言实现线性表的基本操作,能创建一个基于学生信息管理的链表,至少包含数据输入、数据输出、数据处理等操作。

答案:1  悬赏:0  手机版
解决时间 2021-04-12 22:58

用C语言实现线性表的基本操作,能创建一个基于学生信息管理的链表,至少包含数据输入、数据输出、数据处理等操作。在主函数里能实现以下功能。

运行后出现一个选择提示。

可选择的功能有1)创建新的学生信息链表

2)增加一个新的学生信息

3)按学号删除某个学生信息

4)按学号查找某个学生信息

5)可以按照学生成绩对链表排序

6)退出系统

最佳答案

很巧我这里有现成的,还带了很多注释的希望你能用上!


#include <stdio.h>


#include <stdlib.h>


#include <malloc.h>


#include <string.h>


#include <io.h>


#define NULL 0


#define LEN sizeof(struct student)


#define FILE_DATA_PATH "student.txt"



struct student //建立一个学生的结构


{


long int num; //学生人数


char name[20]; //学生姓名


int age; //年龄


char sex[4]; //性别


char birthday[10]; //生日


char address[30]; //地址


long int tele_num; //电话号码


char E_mail[20]; //邮箱


struct student *next; //指针指向学生结构


};



int TOTAL_NUM = 0; //初始化总人数为0


struct student *head = NULL; //指针指向的结构的首位为空



void welcome();


void mainmenu();


void record();


void insert(struct student *stu);


void display(struct student *stu);


void displayAll();


void query();


void query_by_num();


void query_by_name();


void readData();


void writeData();


void freeAll();


void del();


void change();


void devise(struct student *p);



int main() //主函数


{


char userName[9];


char userPWD[7];


int i;


welcome();


for(i = 0; i < 3; i++)


{


printf("\n管理员初始用户名和密码均为admin\n");


printf("请输入您的用户名:");


scanf("%s", userName);



printf("\n请输入您的密码:");


scanf("%s", userPWD);



if ((strcmp(userName,"admin")==0) && (strcmp(userPWD,"admin")==0)) //比较输入的用户名和默认的用户名和密码是否相同,


{


//用户名和密码正确,显示主菜单


mainmenu();


break;


}


else


{


if (i < 2)


{


//用户名或密码错误,提示用户重新输入


printf("用户名或密码错误,请重新输入!");


}


else


{


//连续3次输错用户名或密码,退出系统。


printf("您已连续3次将用户名或密码输错,系统将退出!");


}


}


}


return 0;


}


//显示欢迎信息


void welcome()


{


printf("\t\t\t+---------------------------+\n");


printf("\t\t\t| |\n");


printf("\t\t\t| 欢迎使用学生信息管理系统 |\n");


printf("\t\t\t| |\n");


printf("\t\t\t+---------------------------+\n");


printf("\n\n\n\n\n\n\n\n\n");


printf("\t\t\t------------本程序系软件一班君和双陈所编写");


}



//系统主菜单


void mainmenu()


{


int choice;


choice = -1;


readData();


printf("\n温馨提示:为保证您的操作得到保存,请按正常顺序退出系统^_^\n");


do


{


printf("\n\n\n");


printf("\t\t\t--------------------------------\n");


printf("\t\t\t| 学生信息管理系统 |\n");


printf("\t\t\t--------------------------------\n");


printf("\t\t\t| [1]----录入学生信息 |\n");


printf("\t\t\t| [2]----浏览学生信息 |\n");


printf("\t\t\t| [3]----查询学生信息 |\n");


printf("\t\t\t| [4]----删除学生信息 |\n");


printf("\t\t\t| [5]----修改学生信息 |\n");


printf("\t\t\t| [0]----退出系统 |\n");


printf("\t\t\t|*·*·*·*·*·*·*·*·*·*·|\n");


printf("\t\t\t--------------------------------\n");


printf("请输入您的选择:");


scanf("%d", &choice);


switch(choice)


{


case 0:


writeData();


freeAll();


exit(0);


case 1:


record();


break;


case 2:


displayAll();


break;


case 3:


query();


break;


case 4:


del();


break;


case 5:


change();


break;


default:


printf("\n无效选项!");


break;


}


}


while(choice != 0);


}


//录入学生信息


void record()


{


struct student *p0;



p0 = (struct student *)malloc(LEN); //为学生结构开辟一个内存空间


printf("请输入学生的学号:");


scanf("%ld",&p0->num); //新建的学生指针指向学号,以下类似!


printf("请输入学生的姓名:");


scanf("%s",p0->name);


printf("请输入学生的年龄:");


scanf("%d",&p0->age);


printf("请输入学生的性别:");


scanf("%s",p0->sex);


printf("请输入学生的出生年月:");


scanf("%s",p0->birthday);


printf("请输入学生的地址:");


scanf("%s",p0->address);


printf("请输入学生的电话:");


scanf("%ld",&p0->tele_num);


printf("请输入学生的E-mail:");


scanf("%s",p0->E_mail);



insert(p0);


printf("该学生的信息为:\n");


printf("-------------------------------------------------------------------------------");


printf("学号\t姓名\t年龄\t性别\t出生年月\t\t地址\t电话\tE-mail\n");


display(p0);


}



void insert(struct student *stu) //此函数涉及到线性表插入方法,我认为你如果想看懂需要数据结构的知识(线性表这一章)


{


struct student *p0, *p1, *p2;



p1 = head;


p0 = stu;



if(head == NULL)


{


head = p0;


p0->next = NULL;


}


else


{


while((p0->num > p1->num)&&(p1->next != NULL))


{


p2 = p1;


p1 = p1->next;


}


if(p0->num <= p1->num)


{


if(head == p1)


head = p0;


else


p2->next = p0;


p0->next = p1;


}


else


{


p1->next = p0;


p0->next = NULL;


}


}


TOTAL_NUM++;


}



void display(struct student *p)


{


printf("%ld\t%s\t%d\t%s\t%s\t%s\t%ld\t%s\n", p->num, p->name, p->age, p->sex, p->birthday, p->address, p->tele_num, p->E_mail);


}


//浏览学生信息


void displayAll()


{


struct student *p;



printf("学生总数:%d\n", TOTAL_NUM);


p = head;


if(head != NULL)


{


printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");


printf("-------------------------------------------------------------------------------");


do


{


display(p);


p = p->next;


}


while(p != NULL);


}


printf("\n");


}


//查询学生信息


void query()


{


int choice;


choice = -1;


do


{


printf("\n");


printf("+--------------------+\n");


printf("| [1]---按学号查询 |\n");


printf("| [2]---按姓名查询 |\n");


printf("| [0]---取消 |\n");


printf("+--------------------+\n");



printf("请输入您的选择:");


scanf("%d", &choice);



switch(choice)


{


case 0:


return;


case 1:


query_by_num();


break;


case 2:


query_by_name();


break;


default:


printf("\n无效选项!");


break;


}


}


while(choice != 0);


}


//按学号查询学生信息


void query_by_num()


{


int num;


struct student *p1;



printf("请输入学生的学号:");


scanf("%ld", &num);


if(head==NULL)


{


printf("无学生记录!\n");


return;


}


p1=head;


while(num!=p1->num && p1->next!=NULL)


p1=p1->next;


if(num == p1->num)


{


printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");


printf("-------------------------------------------------------------------------------");


display(p1);


}


else


printf("没有该学生记录,请核对!");


}


//按姓名查询学生信息


void query_by_name()


{


char name[20];


struct student *p1;



printf("请输入学生的姓名:");


scanf("%s", name);


if(head==NULL)


{


printf("无学生记录!\n");


return;


}


p1=head;


while(strcmp(name, p1->name) && p1->next!=NULL)


p1=p1->next;


if(!strcmp(name, p1->name))


{



printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");


printf("-------------------------------------------------------------------------------");


display(p1);


}


else


printf("没有该学生记录,请核对!");


}


//写入文件


void writeData()


{


FILE* fp;//文件指针


struct student *p;



fp = fopen(FILE_DATA_PATH, "w");


if (!fp)


{


printf("文件打开错误!");


return;


}



fprintf(fp,"%d\n", TOTAL_NUM);


for(p = head; p!= NULL; p= p->next)


{


fprintf(fp,"%ld\t%s\t%d\t%s\t%s\t%s\t%ld\t%s\n",


p->num, p->name, p->age, p->sex, p->birthday, p->address, p->tele_num, p->E_mail);


}


fclose(fp);


}



void freeAll()


{


struct student *p1, *p2;



p1=p2=head;


while(p1)


{


p2=p1->next;


free(p1);


p1=p2;


}


}


//读取文件


void readData()


{


FILE* fp;//文件指针


struct student *p1, *p2;



fp = fopen(FILE_DATA_PATH, "r");


if (!fp)


{


printf("文件打开错误!");


return;


}



fscanf(fp,"%d\n", &TOTAL_NUM);


head = p1 = p2 = (struct student *)malloc(LEN);


fscanf(fp,"%ld\t%s\t%d\t%s\t%s\t%s\t%ld\t%s\n",


&p1->num, p1->name, &p1->age, p1->sex, p1->birthday, p1->address, &p1->tele_num, p1->E_mail);


while(!feof(fp))


{


p1 = (struct student *)malloc(LEN);


fscanf(fp,"%ld\t%s\t%d\t%s\t%s\t%s\t%ld\t%s\n",


&p1->num, p1->name, &p1->age, p1->sex, p1->birthday, p1->address, &p1->tele_num, p1->E_mail);


p2->next = p1;


p2 = p1;


}


p2->next = NULL;


fclose(fp);


}


//删除学生信息


void del()


{


struct student *p1, *p2;


long int num;



if(head == NULL)


{


printf("无学生记录!\n");


return;


}



printf("请输入您要删除的学生的学号:");


scanf("%ld", &num);



p1 = head;



while(num != p1->num && p1->next != NULL)


{


p2 = p1;


p1 = p1->next;


}


if(num == p1->num)


{


if(p1 == head)


head = p1->next;


else p2->next = p1->next;


free(p1);


TOTAL_NUM--;


}


else


printf("没有该学生记录,请核对!\n");


}


//修改学生信息


void change()


{


struct student *p1, *p2;


long int num;



if(head == NULL)


{


printf("无学生记录!\n");


return;


}



printf("请输入您要修改的学生的学号:");


scanf("%ld", &num);



p1 = head;



while(num != p1->num && p1->next != NULL)


{


p2 = p1;


p1 = p1->next;


}


if(num == p1->num)


devise(p1);


else


printf("没有该学生记录,请核对!\n");



}



void devise(struct student *p)


{


int choice;


choice = -1;


do


{


printf("请选择您要修改的学生的信息内容:\n");


printf("+----------------------+\n");


printf("| 姓名 请按 1 |\n");


printf("| 年龄 请按 2 |\n");


printf("| 性别 请按 3 |\n");


printf("| 出生年月 请按 4 |\n");


printf("| 地址 请按 5 |\n");


printf("| 电话 请按 6 |\n");


printf("| E-mail 请按 7 |\n");


printf("| 取消 请按 0 |\n");


printf("+----------------------+\n");



printf("请输入您的选择:");


scanf("%d", &choice);



switch(choice)


{


case 0:


return;


case 1:


printf("请输入新姓名:");


scanf("%s", p->name);


break;


case 2:


printf("请输入新年龄:");


scanf("%d", &p->age);


break;


case 3:


printf("请输入新性别:");


scanf("%s", p->sex);


break;


case 4:


printf("请输入新出生年月:");


scanf("%s", p->birthday);


break;


case 5:


printf("请输入新地址:");


scanf("%s", p->address);


break;


case 6:


printf("请输入新电话:");


scanf("%ld", &p->tele_num);


break;


case 7:


printf("请输入新E-mail:");


scanf("%s", p->E_mail);


break;


default:


printf("\n无效选项!");


break;


}


}while(choice != 0);


}


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
手机未解锁bootloader怎么办
电热宝好不好,不能炸了吧
鼓励战胜困难的名言,古文中战胜困难的句子
单选题Most mental illness is&nb
想知道这张 图片 叫什么?出自哪?
这个字“谌”读什么
红运饭店我想知道这个在什么地方
福特探路者怎么样?值得买吗?
淘宝上评价都是5.0可信吗
我是外地户口现在大连金州,想办营业员上岗证
分甘余话阅读答案
火箭对还能向以前吗
魔兽里面什么是YY号啊?该怎么创建??
国家宏观调控的手段包括什么?
he tea and milk both like
推荐资讯
印度电影《美丽人生》中有哪些经典的台词?
抚远市林业局地址有知道的么?有点事想过去
诺基亚2730c照相有时候是nrw格式的.为什么
如果你结婚后 会不会忘掉你曾相爱的人呢
单选题向将军、大名贷款,出钱购买武士身份,
在陌生的地方要怎么让自己快速的成长起来?
这么热的天多喝水有坏处吗
河师大公共管理系男女比例 我是河南师范大学1
急急急!帮我翻译个英语地址!要准确无误!
国外名人经典爱情语录,超经典外国名言!!!
建设银行的卡能在农商银行的ATM机存款吗?
中注协为什么要把注会分成非常6+1
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?