经过线性表的学习,对链表有了更进一步的认识和掌握,链表相比于之前的数组,它对数据的插入、删除,方便了许多,是一种更高效的作法,不用经过挪动数组来插入、删除,只要改变链链接的结点便可。而有序表的操做与数组相似,也是经过移动来插入、删除数据。 上学期也学习过一点链表,但只是粗略的知道有链表这种数据结构的概念,经过此次的学习,学到了链表的一些基本操做,也发现了链表的优势。
查找函数 定义i为Data数组下标 for i=0 to L->Last+1 若是找到数据X 返回i end for 返回ERROR 插入函数 定义Data数组下标i if 未插入数据时,顺序表里数据个数已经等于MAXSIZE-1 输出FULL 返回false end if else if 插入位置在第一个数前面或在最后一个数的后面的后面位置 输出ILLEGAL POSITION 返回false end if else for i=L->Last+1 to i>=P 把前一个数据放到i这个位置 end for 把X赋值给L->Data[P] L->Last++; 返回true end if 删除函数 定义Data数组下标i if 要删除数的位置不在顺序表范围内 输出POSITION P EMPTY 返回false end if else for i=P to L->Last 把第i+1个数往前移 end for L->Last-- 返回true end if
Q1:一开始题目较长,函数又比较多,题目意思不是很理解,Devc上代码写好后,测试时输出结果与题目不一样 A1:第一个函数要求建立并返回一个空的线性表,我一开始是L->last=0,但输出结果老是错的,后来看了网上一些代码,发现L->last=-1才是。若L->last置为0,则插入5个数,实际只有4个数被插进去 Q2:输出结果和题目的同样后,开始提交,一直是答案错误 A2:缘由是我动态申请时,写的是L=(List)malloc(sizeof(struct List)),改为L=(List)malloc(sizeof(struct LNode))就OK了
定义两个指针p,r 把L1->next赋给p 把L1保存在r中 把r后面的关系断掉 while p&&L2 if p->data<L2->data p结点插入r后面 p指针日后移 r指针日后移 end if else if p->data>L2->data L2结点插入r后面 L2指针日后移 r指针日后移 end if else p结点插入r后面 p指针日后移 L2指针日后移 r指针日后移 end if while p p中剩余部分插入r中 end while while L2 L2中剩余部分插入r中 end while r->next=NULL end while
Q1:输出结果错误 A1:题目要求合后的链表头结点为L1,因而,我直接用L1进行操做,把p,L2直接插在L1上,致使输出结果错误。因而我将L1付给r指针,对r指针进行操做 Q2:如何实现合并两个链表和仍保持有序性 A2:经过遍历两个链表,把较小的数那个插入r中,而后移动较小数所在链表和r的指针,若两个数相同,则只插入其中一个,同时移动p、L二、r的指针,最后,若p或L2有剩余数据,则把剩余的所有插进r中
主函数 定义链表指针L1,L2 定义n 输入n 函数调用 尾插法建链表函数 定义链表指针s,r 定义i 给L动态申请空间 L赋给r for i=0 to i<n 给s动态申请空间 输入s->data 把s插到r后面 end for r->next=NULL 合并链表函数 定义两个指针p,r 把L1->next赋给p 把L1保存在r中 把r后面的关系断掉 if p->data<L2->data p结点插入r后面 p指针日后移 r指针日后移 end if else if p->data>=L2->data L2结点插入r后面 L2指针日后移 r指针日后移 end if while p p中剩余部分插入r中 end while while L2 L2中剩余部分插入r中 end while r->next=NULL; 找链表的中间数函数 定义指针p 定义n=0,i=0,j p=L->next; L=L->next; while(p) n++ p指针后移 end while j=(n+1)/2 //中位数 while(L) i++ if i==j 输出中位数 end if L指针后移 end while
Q1:作这题时仍是比较顺利 A1:要寻找两个有序序列的中位数,先把这两个链表合并,而后遍历合并后的链表,计算出该链表的元素个数,找出中位数是第几个数,再遍历链表找到中位数
编写一个程序,找到两个单链表相交的起始节点。
以下面的两个链表:
在节点 c1 开始相交。算法
指针 pA 和 pB 分别指向链表 A 和链表 B 的头结点,以后两个指针分别以步幅为 1 的速度向链表的尾部遍历,当指针 pA 遍历到链表 A 的尾节点时,将指针 pA 指向链表 B 的头部。一样地,当指针 pB 遍历到链表 B 的尾节点时,将指针 pB 指向链表 A 的头部。当两个指针相遇时,指针 pA 或者 pB 所指向的节点就是两个链表的相交节点。
该题用两个指针相对其余作法,下降了时间复杂度和空间复杂度,也简化了代码,算是最优的解题的方法。 多看题能够开拓咱们的思惟,打破咱们的定向思惟,优化算法,找到更高效的解决方法。