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

📄 list.c

📁 这是我自己做的C学生管理系统
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "list.h"


//插入节点,增加学生信息
Node * InsertList(Node * pList,Student stu)//pList表示学生链表的头指针,结构体变量stu存储学生信息
{
	Node * pNode = NULL;                   //pNode指针指向新加入的学生stu
	Node * pTmp = NULL;                    //pTmp指向链表中的节点
	int nCmp=-1;	

	pNode = (Node *)malloc(sizeof(Node));
	if(!pNode) return NULL;                //没申请到空间,函数返回NULL

	pNode->m_stu = stu;					   //输入的数据存储到新节点            
	pNode->m_pNext = NULL;
	
	if(NULL == pList)                      //链表是空链表
	{
		pList = pNode;                     //插入的新节点是第一个结点
	}
	else
	{
		pTmp = pList;                      //插入到第一个节点之前
		nCmp=strcmp(pTmp->m_stu.no,pNode->m_stu.no);   
		if(nCmp==0)                        //学号相同
			return NULL;

		if(nCmp==1)                        // 如果待插入节点的学号小于表中的第一个节点,则直接插入到第一个节点之前		
		{
			pNode->m_pNext=pTmp;
			pList=pNode;
			return pList;
		}
		
		for(;(pTmp ->m_pNext != NULL) && (strcmp(pNode->m_stu.no,(pTmp->m_pNext)->m_stu.no)==1);//pTmp->m_pNext表示pTmp的下一个节点
				pTmp=pTmp->m_pNext);      //新节点插入在pTmp节点之后

		pNode->m_pNext = pTmp->m_pNext;
		pTmp->m_pNext = pNode;
	}
	return pList;
}


//删除接点
Node * deletenode(Node *pList,Node *pNode)
{
	Node *p=NULL,*q=NULL;
	p=pList;                              //表头指针

	if(NULL==pList)                       //空链表的情况	
		return NULL;

	while(p->m_pNext!=NULL && (strcmp(p->m_stu.no,pNode->m_stu.no)!=0))   //寻找删除结点的位置
	{
		q=p;
		p=p->m_pNext;
	}

	if(strcmp(p->m_stu.no,pNode->m_stu.no)==0)
	{
		if(p==pList)	
			pList=p->m_pNext;             //删除链表的第一个结点
		else	
			q->m_pNext=p->m_pNext;        //删除链表结点
		free(p);                          //将结点从链表中分离出来后,使用free函数将此结点的内存空间释放,以供其它变量使用
	}
	else
	{
		return NULL;                      //链表中无此结点
	}

	return(pList);
}


//修改节点的值
void updatenode(Node *pList,Student stu)
{
	Node *p,*q;
	p=pList;                             //表头指针
	
	if(NULL==pList)	                     //空链表的情况
		return;
	
	while(p->m_pNext!=NULL&&(strcmp(p->m_stu.no,stu.no)!=0))           //寻找结点的位置
	{
		q=p;
		p=p->m_pNext;
	}

	if(strcmp(p->m_stu.no,stu.no)==0)
	{
		p->m_stu=stu;                   //把修改后的值传入链表中
	}
	else
	{
		return;
	}
}


//按学号查找节点
Node * searchnode(Node *pList,char No[])
{
	Node *p=NULL,*pNode=NULL;
	p=pList;                            //表头指针
		
	if(NULL==pList)                     //空链表的情况	
		return NULL;

	while(p->m_pNext!=NULL&&(strcmp(p->m_stu.no,No)!=0))             //寻找结点的位置
	{
		p=p->m_pNext;
	}

	if(strcmp(p->m_stu.no,No)==0)
	{
		pNode=p;
	}
	else
	{
		return NULL;
	}

	return(pNode);
}


//保存文件,将链表写入文件
int SaveList(Node * pList,char * strFileName)
{
	FILE * fp = NULL;                             //定义文件类型的指针
	Node * pTmp = NULL;

	fp = fopen(strFileName,"wb+");               
	if(!fp) return -1;

	for(pTmp = pList;pTmp;pTmp = pTmp->m_pNext)
		fwrite(&pTmp->m_stu,sizeof(Student),1,fp); //把&pTmp所指向的1*sizeof(Student)个字节输出到fp所指向的文件中

	fclose(fp);

	return 0;
}

//读取文件中的数据
Node * LoadList(Node * pList,char * strFileName)
{
	FILE * fp = NULL;                           //定义文件类型的指针
	Student stu;

	if(!(fp = fopen(strFileName,"a+"))) return NULL;

	do
	{
		if(fread(&stu,sizeof(Student),1,fp))     //从fp所指定的文件中读取长度为sizeof(Student)的1个数据项,存到&stu的内存区
			pList = InsertList(pList,stu);
	}while(feof(fp)==0);                         //检查文件是否结束
	
	fclose(fp);
	return pList;
}


	

⌨️ 快捷键说明

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