C语言程序设计报告VC通过.docx
- 文档编号:26844008
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:25
- 大小:199.73KB
C语言程序设计报告VC通过.docx
《C语言程序设计报告VC通过.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告VC通过.docx(25页珍藏版)》请在冰豆网上搜索。
C语言程序设计报告VC通过
C语言课程设计报告
实
现
链
表
的
创
建
、
插
入
和
删
除
2010年06月23日
说明:
1、课程设计内容是:
23.实现链表的创建、插入和删除。
2、课程设计的要求是:
应加有操作提示菜单。
3、本课程设计的创新:
加入了链表的打印、搜索、保存功能以及自动载入功能,并且能够搜索同名QQ
4、小组成员:
刘涛、皮智、肖汉鹏
一、此课程设计的模块化图解
二、界面如图:
1)新建链表图示:
2)插入链表图示:
3)删除链表:
4)打印链表:
5)搜索链表:
6)保存链表:
三、源代码如下:
#include
#include
#include
#include
#defineCLSsystem("cls()")
structstr
{
charname[20];
charQQ[12];
char*time;
structstr*next;//指向下一链节的指针
structstr*prior;//指向前一链节的指针
}pp;
structstr*start;
structstr*last;
voidselect(int*sel1,int*sel2,char*_key);
voidcreat(structstr**start,structstr**last);
voidinputs(char*p,char*s,unsignedcount);
voidinfix();
voidinfix_(structstr*,structstr**,structstr**);
voiddel(structstr**start,structstr**last);
structstr*d_find();
voidprint(structstr**start);
voidsearch();
voidsave();
voidload();
//头函数
voidhead()
{
printf("\t*****************************************************************\n");
printf("\t*课程设计23:
链表的新建、插入和删除*\n");
printf("\t*功能:
保存QQ名字及号码~*\n");
printf("\t**madeby&mars&、皮卡丘andゞ無釐頭ゞ*\n");
printf("\t*友情提示:
输完之后记得保存~!
!
!
O(∩_∩)O~*\n");
printf("\t******请用键盘【up】和【down】键控制,确认按【enter】键**********\n");
}
voidback_menu();
//主函数
voidmain()
{
char_key[7]={'<','','','','','',''};
intsel1=0,sel2=-1;
load();
for(;;)
{
sel2=-1;
while(sel2==-1)
{
sel2=-1;
head();
printf("\t\t\t*.
(1)创建链表");
printf("%c\n",_key[0]);
printf("\t\t\t*.
(2)插入链表");
printf("%c\n",_key[1]);
printf("\t\t\t*.(3)删除链表");
printf("%c\n",_key[2]);
printf("\t\t\t*.(4)打印链表");
printf("%c\n",_key[3]);
printf("\t\t\t*.(5)搜索链表");
printf("%c\n",_key[4]);
printf("\t\t\t*.(6)保存链表");
printf("%c\n",_key[5]);
printf("\t\t\t*.(7)退出!
");
printf("%c\n",_key[6]);
select(&sel1,&sel2,_key);
CLS;
}
switch(sel2)
{
case0:
creat(&start,&last);
break;
case1:
infix();break;
case2:
del(&start,&last);break;
case3:
print(&start);break;
case4:
search();break;
case5:
save();break;
case6:
head();
printf("\t\t\t*欢迎使用BYEBYE~*!
\n");
getch();
return;
}
}
}
//选择
voidselect(int*sel1,int*sel2,char*_key)
{
inti;
charkey_c;
key_c=getch();
switch(key_c)
{
//up
case72:
{
if(!
(*sel1))
*sel1=6;
else
(*sel1)--;
}break;
//down
case80:
{
if(6==*sel1)
*sel1=0;
else
(*sel1)++;
}break;
//enter
case13:
*sel2=*sel1;break;
}
for(i=0;i<7;i++)
{
if(i==*sel1)
*(_key+i)='<';
else
*(_key+i)='';
}
return;
}
//创建链表,必须定义成指向指针的指针,不然编译虽然不报错但是输入一次后,无法再次输入,后面也一样
voidcreat(structstr**start,structstr**last)
{
CLS;
head();
structstr*info;
//将链表清空
FILE*fp;
fp=fopen("DATA","wb");
fclose(fp);
*start=*last=NULL;
info=(structstr*)malloc(sizeof(pp));
inputs("\t\t\tメ请输入名字:
",info->name,20);
inputs("\t\t\tメ请输入丘丘号码:
",info->QQ,12);
info->next=NULL;
info->prior=NULL;
*start=info;
*last=info;
back_menu();
}
//判断是否输入过长
voidinputs(char*p,char*s,unsignedcount)
{
chara[255];
for(;;)
{
puts(p);
gets(a);
if(strlen(a)>count)
{
printf("\t\t\tメ别输这么长啊谁的名字呢~!
\n");
continue;
}
else
break;
}
strcpy(s,a);
}
//插入链表
voidinfix()
{
CLS;
head();
if(!
start)
{
printf("\t\t\t链表是空的!
请新建链表再插入\n");
back_menu();
return;
}
structstr*p;
p=(structstr*)malloc(sizeof(pp));
inputs("\t\t\tメ请输入名字:
",p->name,20);
inputs("\t\t\tメ请输入丘丘号码",p->QQ,12);
infix_(p,&start,&last);
back_menu();
}
voidinfix_(structstr*p,structstr**start,structstr**last)
{
registerstructstr*a,*old;
a=*start;
while(a)
{
if(strcmp(a->name,p->name)<0)
{
old=a;
a=a->next;
}
else
{
if(a->prior)
{
a->prior->next=p;
p->next=a;
p->prior=a->prior;
a->prior=p;
return;
}
p->next=a;
a->prior=p;
p->prior=NULL;
*start=p;
return;
}
}
old->next=p;
p->next=NULL;
p->prior=old;
*last=p;
}
//删除链表
voiddel(structstr**start,structstr**last)
{
CLS;
head();
structstr*d;
printf("\t\t\tメ请输入名字.\n");
d=d_find();
if(d)
{
if(*start==d)
{
*start=(*start)->next;
if(*start)
(*start)->prior=NULL;
else
*last=NULL;
}
else
{
d->prior->next=d->next;
if(d==*last)
*last=d->prior;
else
d->next->prior=d->prior;
}
printf("\t\t\tメ删除成功~!
!
\n");
free(d);
}
back_menu();
}
//搜索函数
structstr*d_find()
{
structstr*p;
charch[100];
gets(ch);
CLS;
head();
p=start;
while(p)
{
if(!
strcmp(p->name,ch))
return(p);
p=p->next;
}
printf("\t\t\tメ诶呀~!
名字没有滴~!
\n");
return(NULL);
}
//打印链表
voidprint(structstr**start)
{
CLS;
head();
if(!
(*start))
{
printf("\t\t\t诶呀~!
链表是空滴!
\n");
back_menu();
return;
}
structstr*p;
p=*start;
printf("\t-------name---------------------------QQ---------------------\n");
while(p)
{
printf("\t|%-20s|",p->name);
printf("|%-10s|\n",p->QQ);
p=p->next;
}
printf("\t-------------------------------------------------------------\n");
printf("\n\n");
back_menu();
}
//搜索链表
voidsearch()
{
CLS;
head();
charch[100];
structstr*p;
intt=0;
p=start;
printf("\t\t\tメ请输入名字:
");
gets(ch);
while(p)
{
if(!
strcmp(p->name,ch))
{
t=1;
printf("\t-------------------------------------------------------------\n");
printf("\t|%-20s|",p->name);
printf("|%-20s|\n",p->QQ);
}
p=p->next;
}
if(!
t)
printf("\t\t\tメ诶呀~!
名字没有滴~!
\n");
else
printf("\t-------------------------------------------------------------\n");
back_menu();
}
//保存链表
voidsave()
{
CLS;
head();
structstr*info;
FILE*fp;
info=start;
if(!
start)
{
printf("\t\t\t诶呀!
链表是空滴~!
\n");
back_menu();
return;
}
if(info)
{
fp=fopen("DATA","wb");
if(fp==NULL)//若打开失败
printf("メ擦!
打不开~搞毛哦~~\n");
else
{
while(info)
{
fwrite(info,sizeof(structstr),1,fp);
info=info->next;
}
fclose(fp);
printf("\t\t\tメOK~!
保存成功!
!
\n");
back_menu();
return;
}
}
printf("\t\t\tsorry~!
链表是空滴~!
\n");
back_menu();
return;
}
//自动导入
voidload()
{
structstr*info;
FILE*fp;
fp=fopen("DATA","rb");
if(fp==NULL)
return;
while(!
feof(fp))
{
info=(structstr*)malloc(sizeof(pp));
if(!
info)
return;
if(fread(info,sizeof(structstr),1,fp)!
=1)
break;
if(!
start)
{
info->next=NULL;
info->prior=NULL;
start=info;
last=info;
}
else
infix_(info,&start,&last);
}
fclose(fp);
}
voidback_menu()
{
printf("\t\t\tメ按[任意键]返回主菜单");
getch();
CLS;
return;
}
四、我的主要任务:
插入链表、删除链表。
1、插入链表:
主要思想与冒泡类似,当插入一个的时候便立刻排序,小的靠前,大的靠后。
//插入链表
voidinfix()
{
CLS;
head();
if(!
start)
{
printf("\t\t\t链表是空的!
请新建链表再插入\n");
back_menu();
return;
}
structstr*p;
p=(structstr*)malloc(sizeof(pp));
inputs("\t\t\tメ请输入名字:
",p->name,20);
inputs("\t\t\tメ请输入丘丘号码",p->QQ,12);
infix_(p,&start,&last);
back_menu();
}
voidinfix_(structstr*p,structstr**start,structstr**last)
{
registerstructstr*a,*old;
a=*start;
while(a)
{
if(strcmp(a->name,p->name)<0)
{
old=a;
a=a->next;
}
else
{
if(a->prior)
{
a->prior->next=p;
p->next=a;
p->prior=a->prior;
a->prior=p;
return;
}
p->next=a;
a->prior=p;
p->prior=NULL;
*start=p;
return;
}
}
old->next=p;
p->next=NULL;
p->prior=old;
*last=p;
}
模块:
函数1
{输入名字和QQ然后传给函数2}
函数2{
while(链表存在)
{
if(已存储的名字<输入的名字)
指向下一个名字
else
{
if(已存储名字前是否存在名字)
{
将输入的名字的链表插入其中
}
输入的名字的链表当成链表头start
}
若在链表中输入的名字是最大的,排在最后面当成last
}}
2、删除链表:
主要是将删除后的链表能够将旁边两个再次串起来。
//删除链表
voiddel(structstr**start,structstr**last)
{
CLS;
head();
structstr*d;
printf("\t\t\tメ请输入名字.\n");
d=d_find();
if(d)
{
if(*start==d)
{
*start=(*start)->next;
if(*start)
(*start)->prior=NULL;
else
*last=NULL;
}
else
{
d->prior->next=d->next;
if(d==*last)
*last=d->prior;
else
d->next->prior=d->prior;
}
printf("\t\t\tメ删除成功~!
!
\n");
free(d);
}
back_menu();
}
//搜索函数
structstr*d_find()
{
structstr*p;
charch[100];
gets(ch);
CLS;
head();
p=start;
while(p)
{
if(!
strcmp(p->name,ch))
return(p);
p=p->next;
}
printf("\t\t\tメ诶呀~!
名字没有滴~!
\n");
return(NULL);
}
模块:
函数
{
输入名字;
找到函数;
if(若找到了名字所在链表)
{
if(判断是否是在表头)
{
表头直接指向第二个;
}
else
{
删除此链表;
}
释放内存;
}
}
五、总结:
1)第一次做课程设计,在此过程中确实面临了许多的困难,经过两三周的时间,通过与两位同学的共同努力,终于大功告成啦~!
2)通过这次一大家一起研究,我们了解了链表的用法,指针的用法,函数的一些调用以及各种其他的小技巧,例如将清屏函数与键盘操控的上下键配合能达到比较好的效果。
3)学习时应该多与同学交流,特别在这次与大家一起合作中受益匪浅。
4)让我感触最深的就是原来自己了解的知识真的是太少了,设计中遇到的众多问题让我明白算法的重要性以及写完一个程序将面临的众多漏洞(这漏洞着实让我们弄了好久丫~!
),必须耐心去发掘并想方设法改善。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告 VC 通过