创建一个基于学生信息管理的单链表 (C语言)

一、课程设计内容描述及设计要求主要是实现对学生信息进行系统化的管理,首先可以对学生基本信息进行输入和读取,其次查找并显示特定学生的相关信息,然后可以插入学生的相关信息,还有就是可按学生相关信息排序,以求达到简易操作的目的。 二、系统模块、步骤、流程图三、系统详细设计(代码)不要抄袭 谢谢!
2026年09月18日 01:30
有1个网友回答
网友(1):

/*
主要是实现对学生信息进行系统化的管理,
首先可以对学生基本信息进行输入和读取,
其次查找并显示特定学生的相关信息,
然后可以插入学生的相关信息,
还有就是可按学生相关信息排序,
以求达到简易操作的目的。
*/

#include
#include
#include
#include

/*学生信息结点,信息内容可以自己添加*/
struct StuNode
{
char Name[20];
int Age;

StuNode *pNext;
};

/*输入学生信息*/
bool InputStudentInf(StuNode **pHead)
{
StuNode *pWork = *pHead;

/*第一个学生信息*/
if ( pWork == NULL )
{
*pHead = (StuNode *)malloc(sizeof(StuNode));
memset(*pHead,0x0,sizeof(StuNode));
pWork = *pHead;
}
else
{
while ( pWork->pNext != NULL )
{
pWork = pWork->pNext;
}
pWork->pNext = (StuNode *)malloc(sizeof(StuNode));
memset(pWork->pNext,0x0,sizeof(StuNode));
pWork = pWork->pNext;
}

printf("请输入学生姓名 = ");
fflush(stdin);
scanf("%s",pWork->Name);
printf("请输入学生年龄 = ");
fflush(stdin);
scanf("%d",&(pWork->Age));

printf("继续输入吗?(y继续输入,n结束输入) = ");
char gc = 0;
fflush(stdin);
scanf("%c",&gc);
fflush(stdin);
if ( 'y' == gc )
{
return true;
}
else
{
return false;
}
}

/*销毁链表释放内存*/
void DestroyStudentInf(StuNode **pHead)
{
StuNode *pWork = NULL;
StuNode *pWorkNext = NULL;

pWork = *pHead;
pWorkNext = pWork->pNext;

while ( NULL != pWork )
{
free(pWork);
pWork = pWorkNext;
if ( NULL == pWork )
{
break;
}
pWorkNext = pWork->pNext;
}
*pHead = NULL;
}

/*输出学生链表*/
void OutPutStudentInf(StuNode *pHead)
{
StuNode *pWork = pHead;

while ( NULL != pWork )
{
printf("姓名:%s\t年龄:%d\n",pWork->Name,pWork->Age);
pWork = pWork->pNext;
}
}

/*按姓名查找,返回结点位置,没找到返回-1*/
int FindStudentInf(StuNode *pHead,char *WantName)
{
int pos = 0;

StuNode *pWork = pHead;
while ( NULL != pWork )
{
pos++;
if ( strcmp(WantName,pWork->Name) == 0 )
{
printf("找到姓名为 %s 的学生,年龄为 %d\n",WantName,pWork->Age);
return pos;
}
pWork = pWork->pNext;
}

pos = -1;
printf("无姓名为 %s 的学生\n",WantName);
return pos;
}

/*在某学生结点前插入新学生信息*/
void InsertStudentInf(StuNode **pHead)
{
char WantName[20];
memset(WantName,0x0,sizeof(WantName));
printf("在哪个学生信息前插入数据 = ");
scanf("%s",WantName);

int pos = FindStudentInf(*pHead,WantName);
if ( pos < 0 )
{
printf("不存在名字为 %s 的结点\n",WantName);
return;
}

StuNode * pWork = NULL;
StuNode * pSaveNext = NULL;
if ( pos == 1 )
{
pSaveNext = *pHead;

StuNode *pNewNode = (StuNode *)malloc(sizeof(StuNode));
memset(pNewNode,0x0,sizeof(StuNode));
printf("待插入学生的姓名 = ");
scanf("%s",&(pNewNode->Name));
printf("待插入学生的年龄 = ");
scanf("%d",&(pNewNode->Age));

*pHead = pNewNode;
(*pHead)->pNext = pSaveNext;
}
else
{
int thePos = 1;
pWork = *pHead;
pSaveNext = NULL;
while ( thePos < pos - 1 )
{
pWork = pWork->pNext;
thePos++;
}
pSaveNext = pWork->pNext;

StuNode *pNewNode = (StuNode *)malloc(sizeof(StuNode));
memset(pNewNode,0x0,sizeof(StuNode));
printf("待插入学生的姓名 = ");
scanf("%s",&(pNewNode->Name));
printf("待插入学生的年龄 = ");
scanf("%d",&(pNewNode->Age));

pWork->pNext = pNewNode;
pNewNode->pNext = pSaveNext;
}
}

void SwapNode(StuNode *pN1,StuNode *pN2)
{
StuNode tmp;
tmp.Age = pN1->Age;
pN1->Age = pN2->Age;
pN2->Age = tmp.Age;
strcpy(tmp.Name,pN1->Name);
strcpy(pN1->Name,pN2->Name);
strcpy(pN2->Name,tmp.Name);
}

/*按学生年龄排序*/
void SourtStudentInf(StuNode **pHead)
{
printf("正在排序...\n");
/*计算链表长度*/
int length = 0;
StuNode *pWork = *pHead;
while ( NULL != pWork )
{
length++;
pWork = pWork->pNext;
}

pWork = *pHead;
for ( int i = length ; i > 0 ; i-- )
{
for ( int j = 0 ; j < i ; j++ )
{
if ( pWork != NULL && pWork->pNext != NULL )
{
if ( pWork->Age > pWork->pNext->Age )
{
SwapNode(pWork,pWork->pNext);
}
}
pWork = pWork->pNext;
}
pWork = *pHead;
}
}

void main(void)
{
/*头指针*/
StuNode *pHead = NULL;

/*创建学生信息(输入)*/
while ( InputStudentInf(&pHead) )
{
/*循环体内不需要内容,主要是为了循环创建链表*/
}

/*输出学生链表*/
OutPutStudentInf(pHead);

/*按姓名查找*/
char WantName[20];
memset(WantName,0x0,sizeof(WantName));
printf("输入想查找学生的姓名 = ");
scanf("%s",WantName);
FindStudentInf(pHead,WantName);

/*插入*/
InsertStudentInf(&pHead);

/*输出学生链表*/
OutPutStudentInf(pHead);

/*按学生年龄排序*/
SourtStudentInf(&pHead);

/*输出学生链表*/
OutPutStudentInf(pHead);

/*销毁数据*/
DestroyStudentInf(&pHead);

fflush(stdin);
getchar();
}