要移动到某个地方,可以给一个限制,这个限制可以是最大限制,也可以是放松一点的。(此时有两个条件,一个是要移动到的位置,一个是最大限制)
假如是给最大限制,循环完后就检查是否还想要继续往后“走”,是的话就出错。
假如是放宽限制的,循环完后就检查是否已经超出了最大限制,是的话就出错。
就以循环链表的指定序号位置的插入和删除操作为例
因为删除操作中指针移动的最大限制是在cllist的前两个节点,所以删除操作如果要给出最大限制,在while循环条件那里就要改成p->next->next != cllist,这样效率比较低。于是就放大限制一步,变成p->next != cllist,循环完后检查是否有p->next == cllist,是就错。而在这里限制不能再放大了,再放大就变成p != cllist,结果一次循环也没有。
struct clnode { int data; struct clnode *next; };
int getelem(struct clnode *cllist, int num, int *data) { struct clnode *p1;
if(num < 0) return -1; p1 = cllist->next; while(p1 != cllist && num > 0) { p1 = p1->next; num--; } if(p1 == cllist) return -1; *data = p1->data; return 0; }
int insertelem(struct clnode *cllist, int num, int data) { struct clnode *p1, *p2;
if(num < 0) return -1; p1 = cllist; while(p1->next != cllist && num > 0) { p1 = p1->next; num--; } if(num > 0) return -1; p2 = (struct clnode *) malloc (sizeof(struct clnode)); p2->data = data; p2->next = p1->next; p1->next = p2; return 0; }
int deleteelem(struct clnode *cllist, int num, int *data) { struct clnode *p1, *p2;
if(num < 0) return -1; p1 = cllist; while(p1->next != cllist && num > 0) { p1 = p1->next; num--; } if(p1->next == cllist) return -1; p2 = p1->next; p1->next = p2->next; *data = p2->data; free(p2); return 0; }
|
阅读(531) | 评论(0) | 转发(0) |