📄 list.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 + -