这次将前几天发的顺序表改为单链表实现,总体上也很简单,只是增加了指针域,代码奉上:
#include <stdio.h>
#include<malloc.h>
#include <string.h>
typedef struct {
int no;
char name[8];
float score;
}Student;//定义一个学生基本信息的结构,取名为Student
typedef struct Node{
Student data;//使用Student 类型定义数据域
struct Node *next;//使用自身结构定义指针域
//int listsize;
}LinkNode;//将整个结构定义为LinkNode
//定义链表构造函数
void CreatList(LinkNode *&L,Student a[],int n){
LinkNode *s,*r;
L=(LinkNode *)malloc(sizeof(LinkNode));
r=L;
for(int i=0;i<n;i++){
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
//定义长度函数
int ListLength(LinkNode *L){
int n=0;
LinkNode *p=L;
while(p->next!=NULL){
n++;
p=p->next;
}
printf("该链表长度为%d",n);
return 0;
}
int length(LinkNode *L){
int n=0;
LinkNode *p=L;
while(p->next!=NULL){
n++;
p=p->next;
}
return n;
}
//定义输出函数
void DisList(LinkNode *L){
LinkNode *p=L->next;
int n=0;
LinkNode *q=L;
while(q->next!=NULL){
n++;
q=q->next;
}
printf("**************计科一班学生信息**************\n");
printf("序号\t学号\t姓名\t\t\t成绩\n");
int i=1;
float avescore=0;
while(p!=NULL){
printf("%d\t%d\t%-8s\t\t%.2f\n",i,p->data.no,p->data.name,p->data.score);
//printf("成绩为%f\n",p->data.score);
avescore +=p->data.score;
p=p->next;
i++;
}
printf("平均分为%.2f\n",avescore/n);
//printf("\n");
}
//定义插入函数1,测试用的,赖得删了
int insretlist(LinkNode *&L,int i,Student e){
int j=0;
LinkNode *p=L,*s;
if(i<=0) return false;
while(j<i-1&&p!=NULL){
j++;
p=p->next;
}
if(p==NULL)return false;
else {
s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=e;
s->next=p->next;
p->next=s;
return true;
}
}
//定义插入函数
int insertstu(LinkNode *L){
LinkNode *p=L,*s;
int j=0, i=0,n=0;
LinkNode *q=L;
while(q->next!=NULL){
n++;
q=q->next;
}
printf("请输入插入的位置:");
scanf("%d",&i);
while(j<i-1 && p!=NULL){
p=p->next;
j++;
}
if(p==NULL) return false;
else {
s=(LinkNode *)malloc(sizeof(LinkNode));
int no;char name[8];float score;
printf("请输入该同学的学号(1-4位)\n");
scanf("%d",&no);
while(no<1||no>9999){
printf("不符合学号规定长度,请重新输入!\n");
scanf("%d",&no);
}
s->data.no=no;
printf("请输入该同学的姓名\n");
scanf("%s",&name);
while(strlen(name)<4||strlen(name)>8) {
printf("不符合规定姓名长度,请重新输入!\n");
scanf("%s",&name);
}
strcpy(s->data.name,name);
printf("请输入该同学的成绩\n");
scanf("%f",&score);
int count = 1;
float m=score;
while(m>9){
m=m/10;
count ++;
}
while(count>2||count<1){
printf("不符合规定长度,请重新输入!\n");
count=1;
scanf("%f",&score);
m=score;
while(m>9){
m=m/10;
count ++;
}
}
s->data.score=score;
s->next=p->next;
p->next=s;
printf("插入完成!\n");
DisList(L);
}
}
// bool Dellist(LinkNode *&L,int i,Student &e){
// int j=0;
// LinkNode *p=L,*q;
// if(i<=0)return false;
// while(j<i-1 && p!=NULL){
// j++;p=p->next;
//
// }
// if(p==NULL)
// return false;
//
// else {
// q=p->next;
// if(q==NULL)
// return false;
// e=q->data;
// p->next=q->next;
// free(q);
// return true;
// }
//
//
// }
//定义删除函数
int delstu(LinkNode *L){
LinkNode *p=L,*q;
int j, i;
printf("请输入要删除同学的序号:\n");
scanf("%d",&i);
if(i<1||i>length(L))
{
printf("该同学不存在,请重新输入!\n");
scanf("%d",&i);
}
else {printf("该学生存在");}
while(j<i-1 && p!=NULL){
j++;
p=p->next;
}
q=p->next;
p->next=q->next;
free(q);
printf("删除成功!\n");
DisList(L);
return 0;
}
//定义修改函数,内置修改
int update(LinkNode *L,Student g,Student h){
//int i=1;
LinkNode *p=L->next;
int n=0;
LinkNode *q=L;
while(q->next!=NULL){
n++;
q=q->next;
}
for(int i=0;i<n;i++){
if(p!=NULL && (p->data.no==g.no||p->data.name==g.name||p->data.score==g.score)){
p->data.no=h.no,strcpy(p->data.name,h.name),p->data.score=h.score;
//3printf("找到了,在第%d位",i+1);
}
else {
p=p->next;
}
}
// if(p==NULL){
// printf("p为空");
// return 0;}
// else {
// // printf("第%d次找到\n",i);
// printf("找到了");
// p->data.no=h.no,strcpy(p->data.name,h.name),p->data.score=h.score;
// printf("找到了g,i为%d",i);
// }
return 0;
}
//定义修改函数
int updatestu(LinkNode *&L){
LinkNode *p=L->next;
int no;
printf("请输入要修改的学生序号\n");
scanf("%d",&no);
while(no<1||no>length(L)){
printf("该同学不存在,请重新输入!\n");
scanf("%d",&no);
}
int j=0,no1;
while(j<no){
p=p->next;
j++;
}
if(p!=NULL){
printf("已找到该学生\n");
printf("将该学生学号%d修改为:\n",p->data.no);
scanf("%d",&no1);
while(no1<1||no1>9999){
printf("不符合学号规定长度,请重新输入!\n");
scanf("%d",&no1);
}
p->data.no=no1;
}
char name[8];
printf("将姓名%s修改为:\n",p->data.name);
scanf("%s",&name);
while(strlen(name)<4||strlen(name)>8) {
printf("不符合规定姓名长度(2-8个字符),请重新输入!\n");
scanf("%s",&name);
}
strcpy(p->data.name,name);
printf("将该同学成绩%.2f修改为:\n",p->data.score);
float score;
scanf("%f",&score);
//p->data.score=score;
int count = 1;
float m=score;
while(m>9){
m=m/10;
count ++;
}
while(count>2||count<1){
printf("不符合规定长度(满分100),请重新输入!\n");
count=1;
scanf("%f",&score);
m=score;
while(m>9){
m=m/10;
count ++;
}
}
p->data.score=score;
}
//定义菜单
int menu(){
printf(" \n按回车键进入菜单........\n");
int c;
getchar();
printf("请输入想要操作的代码数字:\n");
printf("****************MENU******************\n");
printf(" 1.插入学生信息\n");
printf(" 2.删除学生信息\n");
printf(" 3.修改学生信息\n");
printf(" 4.查看学生信息表\n");
printf(" 5.查看学生表长度\n");
printf(" 6.退出\n");
scanf("%d",&c);
while(!(c>=1 && c<=6)){
printf("请输入数字1-6!\n");
scanf("%d",&c);
if(c>=1 && c<=6)
break;
}
return c;
}
//定义主函数,进行单链表的初始化,预先插入三条数据,展示学生信息
int main(){
LinkNode *L;
Student data[100];
Student g,h;
g.no=1;strcpy(g.name,"六万群");g.score=99;
h.no=5;
strcpy(h.name,"周小其");
h.score=95;
data[0].no=1;data[1].no=2;
strcpy(data[0].name,"六万群");
strcpy(data[1].name,"八万群");
data[0].score=99;data[1].score=88;
Student e,f;
e.no=3,strcpy(e.name,"九万群"),e.score=56;
CreatList(L,data,2);
insretlist(L,3,e);//插入e,就按群
//Dellist(L,2,f);//删除第二条八万群
update(L,g,h);//找到g改为h
DisList(L);
for(;;){
switch(menu()){
case 1:{
insertstu(L);
break;
};
case 2:{
delstu(L);
break;
}
case 3:{
updatestu(L);
break;
}
case 4:{
DisList(L);
break;
}
case 5:{
ListLength(L);
break;
}
case 6:{
exit(0);
}
}
}
return 0;
}