问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言链表应用编程,急求!!

发布网友 发布时间:2022-05-01 03:23

我来回答

2个回答

热心网友 时间:2022-06-23 05:02

刚写的,挺热乎的,在VS2010上很好的运行,有什么问题随时追问,请采纳,顺便点个赞。

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define size 11
//----------------------课题节点定义----------------------------
typedef struct node
{
int topicId;//课题号
char topic[20];//课题名称
char tutor[20];//指导老师
char office[20];//指导老师办公室
char major[size][20];//可选此课题专业
bool choosed;//是否已被选
char stuName[20];//选此课题学生姓名
int stuId;//选此课题学生学号
node *next;//下一个课题
}node,list;//node用于定义节点,list用于定义链表
//此链表含有一个空头结点,便于操作。
//----------------------函数声明------------------------------
void input(node *&p);//专门处理数据输入
void insert(list *h);//添加课题
void create(list *&h);//建立链表,采用头插法
node* find(list *h,int Id);//查找课题号为Id的课题
void del(list *h,int Id);//删除Id号课题
void edit(list *h,int Id);//修改Id号课题
void printNodeP(node *p);//根据节点指针输出节点信息,只供其他函数调用
void printNode(list *h,int Id);//输出Id号课题信息
void printList(list *h);//输出所有课题信息
bool emptyPrint(list *h);//判断是否存在课题并输出必要的提示信息
void printChoosed(list *h);//输出已选课题信息
void printUnchoosed(list *h);//输出未选课题信息
void destroy(list *h);//销毁链表
int topicSum(list *h);//课题总数
int topicChoosedSum(list *h);//已选课题总数
int topicUnchoosedSum(list *h);//未选课题总数

//-------------------------具体函数实现----------------------------------------
void input(node *&p)
{//格式化输入
int j,major_number;
printf("请依次输入课题号,课题名字,指导老师,办公室编号\n");
scanf("%d%s%s%s",&p->topicId,p->topic,p->tutor,p->office);
printf("请输入可选此课题的专业个数,不超过%d个: ",size - 1);
scanf("%d",&major_number);
printf("请依次输入这%d个专业名称:",major_number);
for(j = 0;j < major_number;j++)
scanf("%10s",p->major[j]);
strcpy(p->major[major_number],"null");//将null作为major数组的哨兵,便于后续处理
printf("此课题是否已被选[y/n ?] ");
getchar();
char ch = getchar();
if(ch == 'y')
{
p->choosed = true;
printf("请输入选此课题学生的名字和学号:");
scanf("%s %d",p->stuName,&p->stuId);
}
else
{
p->choosed = false;
p->stuId = -1;//-1表示课题未选时学生学号
}
}
void printNode(list *h,int Id)
{
node *p = find(h,Id);
if(p->next != NULL)
printNodeP(p->next);//直接调用printNodeP函数
else
printf("不存在此课题,查询失败!\n");
}
void printNodeP(node *p)
{//格式化输出
printf("课题号:%-10d课题名字:%-10s\n",p->topicId,p->topic);
printf("指导老师:%-10s办公室编号:%-10s\n",p->tutor,p->office);
printf("可选此课题的专业:\n");
int i = 0;
while(strcmp(p->major[i],"null") != 0)
printf("%-10s",p->major[i++]);
printf("\n");
if(p->choosed)
printf("%-5s已选此课题,其学号为:%-10d\n\n",p->stuName,p->stuId);
else
printf("此课题还未被选!\n\n");
}
void printList(list *h)
{
if(!emptyPrint(h))
{//链表非空
node *p = h->next;
while(p != NULL)
{
printNodeP(p);
p = p->next;
}
}
}
void insert(list *h)
{
node *p = (node*)malloc(sizeof(node));
input(p);
p->next = h->next;
h->next = p;
}
void create(list *&h)
{
int N;
h = (node*)malloc(sizeof(node));
h->next = NULL;
printf("建立课题数目:");
scanf("%d",&N);
int i;
for(i = 0;i < N;i++)
insert(h);//不断调用insert函数插入节点
}
node* find(list *h,int Id)
{
while(h->next != NULL && h->next->topicId != Id)
h = h->next;
return h;//注意,此处返回的是被查找节点上一个节点的指针
}
void del(list *h,int Id)
{
node *p = find(h,Id);
if(p->next == NULL)
printf("不存在此课题,删除失败!\n");
else
{
node *q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
}
void edit(list *h,int Id)
{
node *p = find(h,Id);
if(p->next != NULL)
input(p->next);//调用input函数重新输入该课程信息
else
printf("不存在此课题,修改失败!\n");
return ;
}
bool emptyPrint(list *h)
{
if(h->next == NULL)
{
printf("没有课题!\n");
return true;
}
return false;
}
void printChoosed(list *h)
{
if(!emptyPrint(h))
{
h = h->next;
do
{
if(h->choosed) printNodeP(h);
h = h->next;
}while(h != NULL);
}
printf("\n");
}
void printUnchoosed(list *h)
{
if(!emptyPrint(h))
{
h = h->next;
do
{
if(!h->choosed) printNodeP(h);
h = h->next;
}while(h != NULL);
}
printf("\n");
}
void destroy(list *h)
{
while(h->next != NULL)
{
node *p = h;
h = h->next;
free(p);
}
free(h);
}
int topicSum(list *h)
{
int count = 0;
if(!emptyPrint(h))
while(h->next != NULL)
{
++count;
h = h->next;
}
return count;
}
int topicChoosedSum(list *h)
{
int count = 0;
if(!emptyPrint(h))
{
h = h->next;
do
{
if(h->choosed) ++count;
h = h->next;
}while(h != NULL);
}
return count;
}
int topicUnchoosedSum(list *h)
{
return topicSum(h) - topicChoosedSum(h);
}
int main()
{
list *head = NULL;
int choice,ID;
printf("----------------主菜单----------------\n");
printf("---------------1、建立课题组----------\n");
printf("---------------2、添加课题------------\n");
printf("---------------3、删除课题------------\n");
printf("---------------4、修改课题------------\n");
printf("---------------5、查询课题------------\n");
printf("---------------6、输出所有课题--------\n");
printf("---------------7、输出已选课题--------\n");
printf("---------------8、输出未选课题--------\n");
printf("---------------9、总课题数------------\n");
printf("---------------10、已选课题数---------\n");
printf("---------------11、未选课题数---------\n");
printf("---------------12、销毁课题组---------\n");
printf("---------------0、退出----------------\n");
printf("请输入您的选择:");
scanf("%d",&choice);
do
{
switch(choice)
{
case 1:
create(head);
break;
case 2:
insert(head);
break;
case 3:
printf("请输入要删除的课题号:");
scanf("%d",&ID);
del(head,ID);
break;
case 4:
printf("请输入要修改的课题号:");
scanf("%d",&ID);
edit(head,ID);
break;
case 5:
printf("请输入要查询的课题号:");
scanf("%d",&ID);
printNode(head,ID);
break;
case 6:
printList(head);
break;
case 7:
printChoosed(head);
break;
case 8:
printUnchoosed(head);
break;
case 9:
printf("课题总数为:%d\n",topicSum(head));
break;
case 10:
printf("已选课题总数为:%d\n",topicChoosedSum(head));
break;
case 11:
printf("未选课题总数为:%d\n",topicUnchoosedSum(head));
break;
case 12:
if(head == NULL)
printf("课题组不存在,销毁失败!\n");
else
destroy(head);
break;
case 0:
return 0;
default:
printf("选择错误!\n");
}
printf("请输入您的选择:");
scanf("%d",&choice);
}while(choice >= 1 && choice <= 12);
return 0;
}

热心网友 时间:2022-06-23 05:02

可参考《数据结构习题集》
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
酸菜坛中盐加多了怎么办 想问问上海附近的城市有哪些小吃特别多的地方,想去放松一下心情。谢... 有一个鬼片开始是好像中国解放,然后好像是妓院引起火最后那里的人被烧死... &lt;鬼片》讲一个女人在上里被货车撞死后埋在山里变鬼报复的电影_百度知 ... 比最小的九位数少1的数是( ),比最大的九位数多1的数是( )A.99999999B... 苹果6Spuls花屏咋回事求大神 梦幻西游飞升降修炼,是系统自动帮你降修,提高修炼上限吗?不是自己不... 小马宝莉公主图片 谁要小马宝莉公主的照片?可以发给我些吗? 浙江职工医保缴费最低每月多少 施工进度计划措施具体内容有哪些? 怎样制定施工进度计划? 用C语言编程:创建一个链表 并在该链表的任意位置实现添加和删除的功能,要求在同一个程序中完成! 用C语言编程(创建一个单向链表) 谁能教我如何打印PDF小册子,也就是32开书本。 远距离能拍摄录像和录音的设备叫什么名字? 便携式同步录音录像设备 求穿越火线有意义有内涵的战队名字 施工进度计划内容包括哪些 专门用于录音录像的器械是什么 请问有带录音功能的摄像头吗?长得什么样(请上图)? 帮我想个LOL战队名字例如IG WE 等战队这样的缩写,有内涵的 谁给帮忙设计个战队名字?要有★,且比较简洁,战队名要有杀气,一往无前的气势! 好听的战队名字!要有内涵,比如WE是世界精英,OMG=Oh!My God! …… 求CF战队名字, 一定要有内涵,而且战队名得是这种格式的, 丶浮生乱流年 丶寂寞舞红颜, 绝对高分 一个PDF文件,可以一页打多页,也可以打印小册子,但我既要多页,也要成册,怎么设置? 我准备建立一个战队,战队名字叫什么比较有内涵 有含义的战队名字 战队内涵高端的名字有哪些? 朋友微信审核给我发了串数字让我发他上是什么意思? 交通警察执法时,一定要配戴录音录像设备吗? c语言程序课程设计,链表,求助 即可以录像又可以录音的电脑工具 施工进度计划的表示方法有什么? 中通快递萧山区二部是在哪里? C语言程序设计 链表的综合操作(急) 慈禧寝宫中的哪件压箱宝贝,让朱先生连说好几声:很难得? 单反相机拍录像,录音用什么设备好 c语言程序设计 使用链表 学生管理系统 急!谁知道中通快递能不能到杭州市萧山区瓜沥镇 中通快递萧山宁围一部在哪里? 7651.9285.9238运单号中通快递 用什么地理绘图软件做这样一幅空间轨迹图? 领导在重视下属之前,一般都会进行哪些暗示? 春节的来历10--15字? 如何在 Word 2003 中恢复丢失的文件 学而思口算宝不能用了? 如何看出老板重不重视你? 杭卅萧山北干街道萧然社区的中通快递寄件快递员电话号码为多少? 我想要一个免费的练习速算的软件或资源,请大家帮帮忙。一定要有用,像《一分钟速算》