动态分配内存的方式实现学生管理系统

#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版权协议,转载请附上原文出处链接和本声明。