高级语言课程设计报告第一次报告:链表

高级语言课程设计报告

序号

31

姓名

许恺

成绩

 

学号

2014011329

E-MAIL及电话

392282363@qq.com  

18810556775

实习题目

第一次报告: 链表

评阅意见:

 

 

 

 

 

 

 

 

                                                       评阅人:

                                                       2015年  月  日

 

  1. 你的代码、注释及运行结果贴图。

#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;

}

 

  1. 设计及调试过程遇到的问题及解决方案。

    各种不会,因为一个return 没有返回到head 上费了老师和我半天劲,还自己瞎写,在自己瞎写的过程中写了许多匪夷所思的代码,完全自创,忘记了C语言的模版性。没有完全理解free(p);的含义,经老师指点,明白只是把空间释放,指针还在那不动。在最前面插入节点时出现错误,进行了更改,把复杂的防超限代码简化。

  1. 心得体会和自我对程序的评价。

    开始他们照书上抄代码,本来我是拒绝的,抄了以后还得自己改编加些特技,本来我是拒绝的,后来前面都是我自己写的代码直到删除奇数节点的部分,duang我就蒙了,很无奈问了老师,抄了书。果然没技术不能太任性,感觉这个程序我对我自己不太满意,对链表还不太熟悉,还不能熟练应用,继续努力。在自以为完成后又被老师发现错误,我不是一个好的程序员,相当于做出软件出了bug,太耻辱了,功能并不完善,报告做的太久了,下次加快速度。唯一值得欣慰的是代码编出来没有什么低级错误,改了两处分号的错误就编译出来了。首先我需要有技术,才能放飞想象力,去开发我想要的东西。首先我要有技术!!还有细心!!!

posted @ 2017-02-19 15:06  拓海藤原  阅读(375)  评论(0编辑  收藏  举报