作为掌握C语言基本语法知识之后的拓展延伸,数据结构再合适不过,首先我们将接触到链表的使用。
在此将以 如下程序样例 分段解析 链表的具体使用方法
首先是程序头部分,其包含如下
1-所需头文件
2-宏定义初始链表成员数量
3-定义链表的数据类型
4-声明各类函数
#include<stdio.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define Num 5
typedef struct stu
{
int num;
double score;
struct stu* next;
}Link;
void menu(Link * head); /*菜单*/
Link* insert(Link *head); /*增*/
Link* dele(Link* head); /*删*/
Link* creat(Link* head, int n); /*创*/
void find(Link* head); /*查*/
void deplay(Link * head); /*展示*/
主函数内容简短精炼,只负责初始化链表头节点 , 菜单调用及内存释放
/*主函数√*/
int main(void)
{
Link* head = NULL;
menu(head);
free(head);
return 0;
}
主要框架交由菜单函数负责? 一个简易的while 循环 与 switch导向 实现各类函数调用与程序的有序执行.
/*菜单√*/
void menu(Link* head)
{
int Get;
int Flag = 2;
int F = 0;
while (Flag != EOF)
{
if(Flag != 2)
system("pause");
system("cls");
printf("---------------Welcome---------------\n"
"->1.创建_数据表(成员数为%d)\n"
"->2.查询_单个成员信息\n"
"->3.展示_所有成员信息\n"
"->4.插入_新成员信息\n"
"->5.删除_某成员信息\n"
"->0.退出\n"
"-------------------------------------\n"
"请输入功能号->>"
, Num);
Flag = scanf("%d",&Get);
switch(Get)
{
case 1:
if (F == 1)
{
printf("链表已创建\n");
break;
}
head = creat(head , Num);
F = 1;
break;
case 2:
if (F == 0)
{
printf("链表未创建\n");
break;
}
find(head);
break;
case 3:
if (F == 0)
{
printf("链表未创建\n");
break;
}
deplay(head);
break;
case 4:
if (F == 0)
{
printf("链表未创建\n");
break;
}
head = insert(head);
break;
case 5:
if (F == 0)
{
printf("链表未创建\n");
break;
}
head = dele(head);
break;
case 0:
printf("\nQuit!\n");
exit(0);
default:
printf("error! intput again!\n");
break;
}
}
}
链表创建函数 此处实参(头节点,宏定义的成员数量) 初始成员数量 由宏定义来完成? 也可更改为输入流文件流输入 皆可?
/*创√*/
Link* creat(Link* head, int n)
{
Link* L, * R;
printf("学员信息录入操作\n");
for (int i = 1; i <= n; i++)
{
printf("请输入第 %d 同学的成绩信息(学号 分数) :",i);
R = (Link*)malloc(sizeof(Link));
while ((scanf("%d %lf", &R->num, &R->score)) == EOF)
printf("输入格式错误 请重新输入->");
R->next = NULL;
if (head == NULL)
head = R;
else
L->next = R;
L = R;
}
return head;
}
链表新成员插入函数? 输入流输入新成员数据 并 有序插入到链表中 同时判断重复成员
/*增√*/
Link* insert(Link* head)
{
Link* q , *p1 ,*p = head;
int flag = 1;
q = (Link*)malloc(sizeof(Link));
printf("学员信息插入操作");
printf("请输入添加的学员学号及成绩->");
while ((scanf("%d %lf", &q->num, &q->score)) == EOF)
{
while (p != NULL)
{
if (p->num == q->num)
{
flag = 0;
printf("学员学号重复-请重新输入->");
break;
}
p = p->next;
}
if (flag == 1)
break;
p = head;
}
if (head == NULL) //空表填入
{
q->next = NULL;
head = q;
return head;
}
if (head->num > q->num)//插入表头之前
{
q->next = head;
head = q;
return head;
}
p = head;
p1 = p->next;
while (p1 != NULL && p1->num < q->num)
{
p = p1;
p1 = p1->next;
}
p->next = q;
q->next = p1;
return head;
}
链表成员删除函数??
/*删*/
Link* dele(Link* head)
{
Link* p, * p1;
int flag = 0;
int num;
double score;
printf("学员信息删除操作");
printf("请输入添加的学员学号及成绩->");
while ((scanf("%d %lf", &num, &score)) == EOF)
printf("输入格式错误 请重新输入->");
p = head;
p1 = p->next;
if (num == head->num && score == head->score) // 删除头节点
{
head = head->next;
flag = 1;
free(p);
return head;
}
while (p1->next!= NULL && num != p1->num)
{
p = p1;
p1 = p1->next;
}
if (p1->num != num && flag == 0)
{
printf("未找到该学员信息\n");
}
else
{
p1 = p1->next;
p->next = p1;
}
return head;
}
链表单个成员信息查询函数? 多种查询方式(学号与成绩)? 并依据输入 进行相应适宜的反馈
/*查√*/
void find(Link * head)
{
int flag;
int num;
double score;
int i = 0;
Link* p = head;
printf("---------------学员成绩查询功能---------------\n");
printf("请选择查询模式:\n"
"->1.按学号查询\n"
"->2.按分数查询\n"
"->");
while (scanf("%d", &flag) == EOF && flag != 1 && flag != 2)
{
printf("输入错误 请重新输入\n->");
}
if (flag == 1)
{
printf("请输入所需查询的学员学号->");
while ((scanf("%d",&num)) == EOF)
printf("输入格式错误 请重新输入->");
while (p != NULL)
{
if (p->num == num)
{
printf("num\t score\n");
printf("%.3d\t%8.2lf\n", p->num, p->score);
break;
}
else if (p->next == NULL)
printf("未找到\n");
p = p->next;
}
}
else if (flag == 2)
{
printf("请输入所需查询的学员分数->");
while ((scanf("%lf", &score)) == EOF)
printf("输入格式错误 请重新输入->");
while (p != NULL)
{
if (p->score == score)
{
i++;
if (i == 1)
printf("num\t score\n");
printf("%.3d\t%8.2lf\n", p->num, p->score);
}
else if (p->next == NULL && i == 0)
printf("未找到\n");
p = p->next;
}
printf("找到该分数学员共%d人\n",i);
}
}
链表 遍历展示函数? 遍历链表所有成员 有序输出所有成员信息并打印到屏幕上
/*展示√*/
void deplay(Link* head)
{
Link* p = head;
printf("num\t score\n");
while ( p != NULL)
{
printf("%.3d\t%8.2lf\n",p->num,p->score);
p = p->next;
}
}
|