第二章学习笔记
第二章我们更深入地学习了线性表,对线性表结构和对其进行的建立、查找、插入、删除等操作都有了更好的理解。
链表的基础操作:
定义:
typedef struct Lnode { int data; struct Lnode *next; }Lnode, *Linklist;
初始化:
void init(Linklist &L) { L=new Lnode; L->next=NULL; }
输出链表:
void show(Linklist &L) { Lnode *p=L->next; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } }
输入链表:
void write(Linklist &L, int lenth) { Lnode *p=L, *NEW; for(int i=0; i<lenth; i++) { NEW = new Lnode; cin>>NEW->data; NEW->next=NULL; p->next=NEW; p=p->next; } }
在小组合作代码中,我写得比较快,自我感觉思路比较清晰,但是在很多细节的地方会出问题,然后又改来改去改很久,比如输入部分我用了字符串数组的方法,导致A后面的数字只能读到个位
bool process(List &L) { string input; bool flag = 1; while(true) { cin>>input; switch(input[0]) { case 'A': add(L, input[1]); //这个input[1]导致无法读取大于9的数字,后改为getchar()获取字母然后在case内再用cin的方法。 break; case 'D': delet(L); break; case 'L': traversal(L); break; case 'E': end(flag); break; } if(flag == 0) { return 0; } if(L.head->next==NULL) { init(L); } } }
除此之外还有很多其他奇奇怪怪的bug也搞不清楚为什么会出现,比如插入数字达到int的上限后无论输入什么写入链表的数字都是2147483647。跑代码的时候非正常退出是最让人崩溃的,因为没有报错的提示,找出错误就好像大海捞针一样,这时候必须沉下心来重新细致地从头看一遍代码,但是有时候看很多遍还是找不到错误,归根结底还是基础知识不牢固和经验不足的原因。在有很多指针和元素的情况下有时候会思维很混乱,这时候我会在电脑上或者在纸上画出链表的结构以及每个指针指向的位置,比较方便理解,但是这样做很慢,希望在以后写代码的过程中能够对链表的理解更上一层楼,让思绪更加清晰。此外还可以去了解一下一些常用函数的最佳写法,以提高自己写代码的效率以及代码本身的效率。
我觉得我们小组刚开始都是各打各的代码,有问题才提出来讨论的方法可能有点缺乏合作,但是这样确实可以让每个人都能完整地过一遍写一个程序的思考过程,在完成代码后我们会互相进行测试,然后找出问题回去改,感觉这些问题都给我留下挺深刻的印象的,短时间内应该不太容易再次出现。在小组学习的模式下能让我更好地发现自己的不足,以及加深对这些不足的印象,也能明显地感觉到自己在完成任务的过程中有些焦躁。