高级语言课程设计报告
序号 | 31 | 姓名 | 许恺 | 成绩 | |
学号 | 2014011329 | E-MAIL及电话 |
| ||
实习题目 | 第一次报告: 链表 | ||||
评阅意见: 评阅人: 2015年 月 日 |
- 你的代码、注释及运行结果贴图。
#include <stdio.h>
#include <stdlib.h>
struct link *appendnode(struct link *head);
struct link *insertnode(struct link *head);
struct link *deletenode(struct link *head);
struct link *specialfunction(struct link *head);//指删除奇数节点
void displynode(struct link *head);
void deletememory(struct link *head);
void caidan();
struct link
{
int data;
struct link *next;
};
int main()
{
int i=0,a;
char c;
struct link *head=NULL;
do
{
caidan();
scanf("%d",&a);
switch(a)
{
case 1:{head=appendnode(head); break;}
case 2:{head=insertnode(head); break;}
case 3:{head=deletenode(head); break;}
case 4:{displynode(head); break;}
case 5:{head=specialfunction(head); break;}
case 0:{printf("谢谢使用\n"); deletememory(head); exit(0);}
}
}while(1);
deletememory(head);
return 0;
}
struct link *appendnode(struct link *head) //添加节点
{
struct link *p=NULL,*pr=head;
int data;
p=(struct link *)malloc(sizeof(struct link));
if(p==NULL) //健壮性
{
printf("no enough memory to allocate!\n");
exit(0);
}
if(head==NULL) // 检查是否为空链表
{
head=p;
p->next=NULL;
}
else
{
while(pr->next!=NULL)
pr=pr->next;
pr->next=p;
p->next=NULL;
}
printf("please input the data.\n");
scanf("%d",&data);
p->data=data;
displynode(head);
return head;
}
void displynode(struct link *head) //展示链表信息
{
struct link *p=head;
int i=1;
printf(" 节点数 节点数据\n" );
while(p!=NULL)
{
printf("%5d%10d\n",i,p->data);
p=p->next;
i++;
}
}
struct link *insertnode(struct link *head) //插入 节点
{
struct link *p=NULL,*pr=head;
int b,i,data;
p=(struct link *)malloc(sizeof(struct link));
if(p==NULL) //健壮性
{
printf("没有足够内存申请新节点\n");
return head;
}
if(head==NULL)
{
head=p;
p->next=NULL;
}
else
{
printf("请输入您要在第几个节点后插入\n");
scanf("%d",&b);
i=0;
if(b==0)
{
p->next=head;
head=p;
}
else
{
while(b-1)
{
pr=pr->next;
b--;
if(pr==NULL&&b!=0)
{
printf("输入数据超出节点数量\n");
return head;
}
}
p->next=pr->next;
pr->next=p;
}
}
printf("please input the data.\n");
scanf("%d",&data);
p->data=data;
displynode(head);
return head;
}
struct link *deletenode(struct link *head) //删除节点函数
{
struct link *pr=head,*p=head;
int b,i;
if(head==NULL) //健壮性
{
printf("此链表为空\n");
return head;
}
do
{
i=0;
printf("请输入要删除第几个节点,输入0取消删除\n");
scanf("%d",&b);
if(b==0) return head;
if(b==1)
{
head=pr->next;
free(pr);
displynode(head);
return head;
}
else
{
while(b-2)
{
pr=pr->next;
p=p->next;
b--;
if(pr==NULL&&b!=0) //健壮性,防止输入超限
{
printf("输入数据超出节点数量\n");
return head;
}
}
}
}while(i);
if(pr->next==NULL||b==1)
{
pr=NULL;
free(pr);
}
else
{
p=p->next;
pr->next=p->next;
free(p);
}
displynode(head);
return head;
}
void deletememory(struct link *head) //删除记忆
{
struct link *p=head,*pr=NULL;
while(p!=NULL)
{
pr=p;
p=p->next;
free(pr);
}
}
void caidan() //菜单函数,方便使用
{
printf(" 链表机器人\n");
printf(" 1.添加节点\n");
printf(" 2.插入节点\n");
printf(" 3.删除节点\n");
printf(" 4.链表显示\n");
printf(" 5.删除节点数据为奇数的节点\n");
printf(" 0.退出程序\n");
}
struct link *specialfunction(struct link *head) //删除奇数节点
{
struct link *p=head,*pr=head;
int data;
if(head==NULL)
{
printf("Linked Table is empty!\n");
return head;
}
while(p!=NULL)
{
if(p->data%2!=0)
{
if(p==head)
{
head=p->next;
}
else
{
pr->next=p->next;
}
free(p);
p=pr->next;
}
else
{
pr=p;
p=p->next;
}
}
/*while(pr!=NULL)
{
if((pr->data)%2!=0) 失败之作仅供批判
{
if(pr==head)
{
head=pr->next;
free(pr);
pr=head;
p=head;
}
else
{
if(pr->next==NULL)
{
pr=NULL;
p=NULL;
free(pr);
}
else
{
while(p->next->data%2==0)
{
p=p->next;
}
p->next=pr->next;
free(pr);
p=head;
pr=pr->next;
}
}
}
else
{
pr=pr->next;
}
}*/
displynode(head);
return head;
}
- 设计及调试过程遇到的问题及解决方案。
各种不会,因为一个return 没有返回到head 上费了老师和我半天劲,还自己瞎写,在自己瞎写的过程中写了许多匪夷所思的代码,完全自创,忘记了C语言的模版性。没有完全理解free(p);的含义,经老师指点,明白只是把空间释放,指针还在那不动。在最前面插入节点时出现错误,进行了更改,把复杂的防超限代码简化。
- 心得体会和自我对程序的评价。
开始他们照书上抄代码,本来我是拒绝的,抄了以后还得自己改编加些特技,本来我是拒绝的,后来前面都是我自己写的代码直到删除奇数节点的部分,duang我就蒙了,很无奈问了老师,抄了书。果然没技术不能太任性,感觉这个程序我对我自己不太满意,对链表还不太熟悉,还不能熟练应用,继续努力。在自以为完成后又被老师发现错误,我不是一个好的程序员,相当于做出软件出了bug,太耻辱了,功能并不完善,报告做的太久了,下次加快速度。唯一值得欣慰的是代码编出来没有什么低级错误,改了两处分号的错误就编译出来了。首先我需要有技术,才能放飞想象力,去开发我想要的东西。首先我要有技术!!还有细心!!!