⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc23-5.c

📁 关于学习C语言的电子书籍
💻 C
字号:
/*****************
	tc23-5.c
   学生信息系统
******************/

/* 文件头与主函数 */

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct Student					/* 定义链表结构 */
{
	int num; 
	char name[8];		
	struct Student * next;
 } Stud;

/*函数说明*/
Stud * create_list( );					/* 此函数用于建立空链表 */	
int insert_list(Stud * head,Stud * std,int n);	/* 此函数用于向链表插入新结点*/
int del_list(Stud * head,Stud * std);			/* 此函数用于删除链表结点*/
Stud*  find_list(Stud * head,Stud * std);		/* 此函数用于查找指定的结点*/
void brow_list(Stud * head);				/* 此函数用于浏览链表*/

main( )
{
	Stud *head;						/* 定义链表头指针 */
	Stud newstd;
	int choice;
	head=NULL;						/* 初始化头指针 */
	printf("        学生信息系统\n");
	printf("1. 建立链表\n");				/* 显示选项 */
	printf("2. 插入新生\n");
	printf("3. 查找学生\n");
	printf("4. 删除学生\n");
	printf("5. 数据浏览\n");
	printf("0. 退出程序\n");

	do
	{	
	printf("请选择操作(输入0-5):");
		scanf("%d",&choice);				/* 输入数值选择要进行的操作*/	
		if(choice>5||choice<0)				/* 确保输入值为可选取项 */
		{
			printf("输入错误!\07\n");
			continue;
		}
		switch (choice)					/* 利用开关语句执行选项*/
		{
		case 1:
			if(head==NULL)				/* 头指针为空方可建立链表,避免重复建表*/
				head=create_list( );		/* 调用函数create_list建立链表,得到头指针*/
			break;
		case 2:
			if(head==NULL)				/* 确保链表存在,方可执行以下操作*/
			{	
				printf("链表未建立!\n");
				break;
			}
			while(1)
			{		
				printf("学号(输入0 结束):");
				scanf("%d",&newstd.num);
				if(newstd.num==0)			/* 当输入0时终止循环 */	
					break;
				printf("姓名:");
				scanf("%s",newstd.name);
				insert_list(head,&newstd,-1);	/* 调用函数insert_list插入新结点 */
			}
			break;
		case 3:
			printf("输入姓名:");
			scanf("%s",newstd.name);
			find_list(head,&newstd);			/* 调用函数find_list查找结点 */
			break;
		case 4:
			printf("输入姓名:");
			scanf("%s",newstd.name);
			del_list(head,&newstd);			/* 调用函数del_list删除结点 */
			break;
		case 5:
			brow_list(head);					/* 调用函数brow_list浏览结点 */
			break;
		default:
			return;						/* 选项不为1~5时结束程序 */
		}
	}while(1);
}


/* 建立链表 */
Stud * create_list( )							/* 建立空链表*/
{
	Stud * head;
	head=malloc(sizeof(Stud));						/* 为头结点分配存储空间*/
	if(head!=NULL)								/* 确保链表成功建立,并返回相应信息*/
		printf("链表已建立!\n");
	else
		printf("没有足够内存空间!\07\n");
	head->next=NULL;							/* 头结点初始化 */
	head->num=0;								/* 学号初始化    */
	return head;								/* 返回头结点地址给头指针 */
}


/* 插入结点	*/
int insert_list(Stud * head,Stud * std,int n)	/* 插入结点*/
{
	Stud * p,* q,* s;
	s=malloc(sizeof(Stud));				/* 为新结点分配存储空间 */
	if(s==NULL)
	{
		printf("没有足够内存空间!\07\n");
		return 0;						/* 插入失败返回0*/
	}	
	q=head;							/* 指针初始化 */
	p=head->next;						/* p指向第一个结点 */
	while(p!=NULL && n!=q->num)			/* 当链表未到尾结点且n不等于下一学号时循环*/
	{  
		q=p;							/* 让p指向下一结点	*/
		p=p->next;
	}
/*将新结点s加入到链表中,如果学号n存在,s将插到n前,否则将插到链表尾*/
	q->next=s;			
	s->next=p;
	strcpy(s->name,std->name);				/*将姓名存入新结点*/
	s->num =std->num;					/*将学号存入新结点*/
	return 1;							/*插入成功返回1*/
}


/* 查找结点 */
Stud * find_list(Stud * head,Stud * std)			/* 查找指定的结点*/
{
	Stud * p;
	p=head;								/* 初始化指针*/
	/* 当链表到达尾结点或name等于当前姓名时结束循环 */
	while(p!=NULL && strcmp(p->name,std->name)) 	/*使用strcmp来进行字符串比较*/
		p=p->next;							/* 向后移动结点指针 */
	if(p!=NULL)
	{
		printf("学号:%d    姓名:%s\n",p->num,p->name);
	}	
	else
		printf("查无此人!\n");
	return p;							/*如果找到name,返回指向它的指针,否则返回空指针*/
}

/*  删除结点 */
int del_list(Stud * head,Stud * std)	/*删除指定结点*/
{
	Stud * p,*q;
	q=head;							/* 初始化指针*/
	p=head->next;
/* 当链表到达尾结点或name等于下一结点的姓名时结束循环*/
	while(p!=NULL && strcmp(p->name,std->name))
	{
		q=p;							/*移动指针,p为当前结点指针,q为下一结点指针*/
		p=p->next;
	}
	if(p!=NULL)						/*找到姓名为name时删除该结点*/
	{
		q->next =p->next;				/*调整指针,使p->next指向q的下一结点*/
		free(p);						/*释放该结点存储空间*/
		printf("删除完成!\n");
		return 1;						/* 删除成功返回1*/
	}
	else
	{	
		printf("查无此人!\07\n");
		return 0;						/* 找不到姓名为name的结点,返回0*/
	}
}

/* 浏览链表*/
void brow_list(Stud * head)
{
	Stud *p;
	p=head->next;						/*初始化指针*/
	while(p!=NULL)						/*未到链表尾时循环*/
	{
		printf("学号:%d    姓名:%s\n",p->num,p->name);
		p=p->next;						/*移动指针*/
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -