#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
//学生节点。
typedef struct _STU
{
char arrStuNum[10];
char arrStuName[10];
int iStuScore;
struct _STU* pNext;//指向下一个节点。
}STUNODE;
//申明链表的头和尾。
STUNODE* g_pHead = NULL;
STUNODE* g_pEnd = NULL;
//删除指定的学生。
void DeleteStuNode(STUNODE* pNode);
int main()
{
int nOrder = -1;
char arrStuNum[10] = { '\0' };
char arrStuName[10] = { '\0' };
int iStuScore = -1;
int nFlag = 1;
STUNODE* pTemp = NULL;
//显示指令。
ShowOrder();
while (nFlag)
{
printf("请输入操作指令(0为查看指令)\n");
scanf("%d", &nOrder);
switch (nOrder)
{
case 1://添加一个学生信息。
printf("输入学号:");
scanf("%s", arrStuNum);
printf("输入姓名:");
scanf("%s", arrStuName);
printf("输入分数:");
scanf("%d", &iStuScore);//取地址。
AddStuMSG(arrStuNum, arrStuName, iStuScore);
break;
case 10://头添加。
printf("输入学号:");
scanf("%s", arrStuNum);
printf("输入姓名:");
scanf("%s", arrStuName);
printf("输入分数:");
scanf("%d", &iStuScore);//取地址。
AddStuMSGToLinkHead(arrStuNum, arrStuName, iStuScore);
break;
case 11://指定位置添加。
printf("输入需要查找的学号:");
scanf("%s", arrStuNum);
pTemp = FindStuByNum(arrStuNum);
if (NULL != pTemp);
{
//插入。
printf("输入学号:");
scanf("%s", arrStuNum);
printf("输入姓名:");
scanf("%s", arrStuName);
printf("输入分数:");
scanf("%d", &iStuScore);
InSertNod(pTemp, arrStuNum, arrStuName, iStuScore);
}
break;
case 2://打印指定学生信息。
printf("输入学号:");
scanf("%s", arrStuNum);
//查找。
pTemp = FindStuByNum(arrStuNum);
//打印。
if (NULL != pTemp);
{
printf("学号:%s,姓名:%s,成绩:%d\n", pTemp->arrStuNum, pTemp->arrStuName, pTemp->iStuScore);
}
break;
case 3:
printf("输入需要修改的学号:");
scanf("%s", arrStuNum);
//查找。
pTemp = FindStuByNum(arrStuNum);
//打印。
if (NULL != pTemp);
{
//修改学号。
printf("输入修改后的学号:");
scanf("%s", arrStuNum);
strcpy(pTemp->arrStuNum, arrStuNum);
//修改姓名
printf("输入修改后姓名:");
scanf("%s", arrStuName);
strcpy(pTemp->arrStuName, arrStuName);
//修改分数。
printf("输入修改后分数:");
scanf("%d", &iStuScore);
}
break;
case 4:
break;
case 5:
break;
case 6://删除指定学生节点。
printf("输入需要删除的学号:");
scanf("%s", arrStuNum);
//查找。
pTemp = FindStuByNum(arrStuNum);
//打印。
if (NULL != pTemp)
{
//调用删除学生的函数。
DeleteStuNode(pTemp);
}
break;
case 7:
break;
case 8://打印数据(链表)。
ShowStuData();
break;
case 9:
nFlag = 0;
break;
case 0:
//查看指令。
ShowOrder();
break;
default:
printf("输入的指令不对");
break;
}
}
//释放链表。
FreeLinkData();
system("pause");
return 0;
}
//删除指定的学生。
void DeleteStuNode(STUNODE* pNode)
{//只有一个节点。
if (g_pHead == g_pEnd)
{
free(g_pHead);
g_pHead = NULL;
g_pEnd = NULL;
printf("删除成功\n");
}
else if (g_pHead->pNext == g_pEnd)//有两个节点。
{
if (g_pHead == pNode)
{
g_pHead = g_pEnd;
printf("删除成功\n");
}
else
{
free(g_pEnd);
g_pEnd = g_pHead;
g_pHead->pNext = NULL;//g_pEnd虽然被删除,但空间仍然被g_pHead->pNext指向。易导致操作越界。
printf("删除成功\n");
}
}
else//常规删除。
{
STUNODE* pTemp = g_pHead;
//判断头。
if (g_pHead == pNode)
{
//记住头。
pTemp = g_pHead;
g_pHead = g_pHead->pNext;
free(pTemp);
pTemp = NULL;
return;
}
while (pTemp)
{
if (pTemp->pNext == pNode)
{
//删除。
if (pNode == g_pEnd)
{
free(pNode);
pNode = NULL;
g_pEnd = pTemp;
g_pEnd->pNext = NULL;
return;
}
else
{
//记住要删除的节点。
STUNODE* p = pTemp->pNext;
//链接
pTemp->pNext = pTemp->pNext->pNext;
//释放节点。
free(p);
p = NULL;
return;
}
}
pTemp = pTemp->pNext;
}
}
}