#include <stdio.h>
#include <stdlib.h>
struct Student //学生信息结构
{
char name[10];
int num;
int math;
};
struct Node //定义结点结构
{
struct Student data;//student作为结构体变量
struct Node *next;
};
struct Node *CreateList() //创建头节点
{
struct Node *HeadNode = (struct Node *)malloc(sizeof(struct Node)); //动态分配内存
HeadNode->next = NULL;
return HeadNode; //返回头节点
}
struct Node *CreateNode(struct Student data) //创建节点
{
struct Node *NewNode = (struct Node *)malloc(sizeof(struct Node)); //动态分配内存
NewNode->data = data; //给节点赋值
NewNode->next = NULL;
return NewNode;
}
void insertNodeByHead(struct Node *HeadNode, struct Student data) //头插法
{
struct Node *NewNode = CreateNode(data); //创建新节点
NewNode->next = HeadNode->next; //把头节点的next赋给新节点的next
HeadNode->next = NewNode; //头节点的next赋给新节点,之后插入新节点,也将会成为头节点的next,而老节点将成为新节点的next
}
void DeleteNodeByData(struct Node *HeadNode, int num) //指定数据删除节点
{
struct Node *posNode = HeadNode->next; //把头节点next赋给posNode(posNode就是要找的指定数据节点)
struct Node *posNodeFront = HeadNode; //posNodeFront作为posNode的前节点,作用就是链接posNode的next,这样posNode就可被释放即成功删除。
if (posNode == NULL) //判断链表是否为空
{
printf("链表为空。");
}
else
{
while (posNode->data.num != num) //循环查找值是否对应,不对应就向下查找。
{
posNodeFront = posNode;
posNode = posNodeFront->next; /*顺序往后推*/
if (posNode == NULL) //查找到结尾为NULL
{
printf("未找到指定数据。");
}
}
posNodeFront->next = posNode->next; //找到数据并且执行跨越链接操作
free(posNode); //释放(即删除)
}
}
void printList(struct Node *HeadNode) //输出链表
{
struct Node *pMove = HeadNode->next; //移动节点定位
printf("编号\t姓名\t成绩\n");
while (pMove) //循环输出
{
printf("%d\t%s\t%d\t\n", pMove->data.num, pMove->data.name, pMove->data.math);
pMove = pMove->next;//移动节点往后走
}
}
int main(void)//主函数
{
struct Node *list = CreateList();//定义链表并创建
struct Student st1;//存放学生信息
while (1) //录入学生信息
{
printf("请输入学生的姓名,学号,成绩。\n");
scanf("%s%d%d", st1.name, &st1.num, &st1.math);
fflush(stdin); //清除键盘缓冲区里的回车符
insertNodeByHead(list, st1); //压入链表
printf("countinue?(Y/N)?\n");
int sign = getchar(); //标识符
if (sign == 'n' || sign == 'N')
{
break;
}
}
printf("是否删除学生信息?(Y/N)\n");
fflush(stdin);//清除键盘缓冲区里的回车符
int sign = getchar();
if (sign == 'n' || sign == 'N')
{
;
}
else
{
printf("请输入要删除的学生编号:\n");
while (1)//删除信息循环
{
int num;
scanf("%d", &num);
DeleteNodeByData(list, num);//删除对应学号的学生信息
printf("countinue?(Y/N)");
fflush(stdin);//清空缓冲区
int chioce = getchar();
if (chioce == 'n' || chioce == 'N')
{
break;
}
}
}
printf("-------------------\n");
printList(list);
printf("-------------------\n");
system("pause");
return 0;
}
数据结构基础,代码释义已经放在注释里。
不过还是有很多问题,例如查找没有的学生信息之后会结束程序运行,算是一个BUG,还没有找到原因在哪里。
运行截图示例: