#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student{
char id[20];//学号
char name[20];//姓名
int age;//年龄
char certificateNum[20];//学位证书编号
}stu;
//初始化
typedef struct Link{
stu elem;
struct Link *next;
}link;
//创建单链表
link *initLink()//link表示创建*类型,initlink表示定义指针类型
{
link *p=(link *)malloc(sizeof(link));//p为头结点
link *temp=p; //为每个结点存放值,开始temp,p共同指向头结点,遍历整个链表
int i,num;
printf("请输入已有学生数目:\n");
scanf("%d",&num);
stu s;
for(i=1;i<=num;i++)
{
printf("第%d个学生的信息\n",i);
printf("学号:");
scanf("%s",&s.id);
printf("姓名:");
scanf("%s",&s.name);
printf("年龄:");
scanf("%d",&s.age);
printf("学位证书编号:");
scanf("%s",&s.certificateNum);
link *a=(link *)malloc(sizeof(link));//分配内存空间并返回基地址
memcpy(&(a->elem),&s,sizeof(stu));//拷贝函数 memcpy(a,b,c) b地址的内容拷贝给a地址,拷贝c个大小
a->next=NULL;
temp->next=a;//temp,p指向a
temp=temp->next;//temp=a
}
return p;
}
//增加
void addNode(link *p)
{
stu s;
printf("新增信息:\n");
printf("学号:");
scanf("%s",&s.id);
printf("姓名:");
scanf("%s",&s.name);
printf("年龄:");
scanf("%d",&s.age);
printf("学位证书编号:");
scanf("%s",&s.certificateNum);
link *temp=p;//指向头节点
while(temp->next)
{
temp=temp->next;
}
link *a=(link *)malloc(sizeof(link));
memcpy(&(a->elem),&s,sizeof(stu));
a->next=NULL;
temp->next=a;
}
//删除
void delNode(link *p)
{
int a;
stu s;
printf("删除位置:");
scanf("%d",&a);
link *temp=p;
int i=1;
for(;i<=a;i++)
{
temp=temp->next;
}
link *del=temp->next; //标记删除节点
temp->next=temp->next->next;
free(del);
}
// 修改
void modNode(link *p)
{
int a;
stu s;
printf("更新信息:\n");
scanf("%d",&a);
printf("\t学号:");
scanf("%s",&s.id);
printf("\t姓名:");
scanf("%s",&s.name);
printf("\t年龄:");
scanf("%d",&s.age);
printf("\t学位证书编号:");
scanf("%s",&s.certificateNum);
link *temp=p;
int i;
for(i=1;i<=a;i++)
{
temp=temp->next;
}
memset(&(temp->elem),0,sizeof(stu));
memcpy(&(temp->elem),&s,sizeof(stu));
}
//查找
void findNode (link *p)
{
int b;
link *temp=p;
printf("查找位置:\n");
scanf("%d",&b);
int i;
for(i=1;i<=b;i++)
{
temp=temp->next;
}
stu s;
memcpy(&s,&(temp->elem),sizeof(stu));
printf("查询结果\n");
printf("\t学号:%s\n",s.id);
printf("\t姓名:%s\n",s.name);
printf("\t年龄:%d\n",s.age);
printf("\t学位证书编号:%s\n",s.certificateNum);
}
//插入
void insertNode(link *p)
{
int b;
stu s;
printf("插入位置:");
scanf("%d",&b);
printf("插入信息:\n");
printf("\t学号:");
scanf("%s",&s.id);
printf("\t姓名:");
scanf("%s",&s.name);
printf("\t年龄:");
scanf("%d",&s.age);
printf("\t学位证书编号:");
scanf("%s",&s.certificateNum);
link *a=(link *)malloc(sizeof(link));
memcpy(&(a->elem),&s,sizeof(link));
link *temp=p;
int i=1;
for(;i<b;i++)
{
temp=temp->next;
}
a->next=temp->next;
temp->next=a;
}
//显示函数
void printNode(link *p)//输出结点数据域
{
stu s;
link *temp=p;
int i=1;
while(temp->next) //是否存在
{
temp=temp->next;
memcpy(&s,&(temp->elem),sizeof(stu));
printf("%d个学生信息:\n",i);
printf("\t\t学号:%s\n",s.id);//\t:实现缩进
printf("\t\t姓名:%s\n",s.name);
printf("\t\t年龄:%d\n",s.age);
printf("\t\t编号:%s\n",s.certificateNum);
printf("----------------------\n");
i++;
}
printf("\n");
}
void menu(){
printf("链表初始化:\n");
link *p=initLink();
int i;
while(1){
printf("----------------------学生管理系统-----------------------\n");
printf(" 1.添加 \n");
printf(" 2.删除 \n");
printf(" 3.更新 \n");
printf(" 4.插入 \n");
printf(" 5.查找 \n");
printf(" 6.显示 \n");
printf(" 7.退出 \n");
printf("--------------------------------------------------------\n");
printf("\t\tchoose(1-7):");
scanf("%d",&i);
if(i==7) break;
switch(i){
case 1:addNode(p);
break;
case 2:delNode(p);
break;
case 3:modNode(p);
break;
case 4:insertNode(p);
break;
case 5:findNode(p);
break;
case 6:printNode(p);
break;
}
}
}
int main()
{
menu();
return 0;
}
版权声明:本文为m0_55951222原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。