Chinaunix首页 | 论坛 | 博客
  • 博客访问: 47020
  • 博文数量: 33
  • 博客积分: 1301
  • 博客等级: 中尉
  • 技术积分: 335
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-31 21:06
文章分类
文章存档

2009年(33)

我的朋友

分类:

2009-07-14 16:17:20

要移动到某个地方,可以给一个限制,这个限制可以是最大限制,也可以是放松一点的。(此时有两个条件,一个是要移动到的位置,一个是最大限制)
假如是给最大限制,循环完后就检查是否还想要继续往后“走”,是的话就出错。
假如是放宽限制的,循环完后就检查是否已经超出了最大限制,是的话就出错。
就以循环链表的指定序号位置的插入和删除操作为例
 
因为删除操作中指针移动的最大限制是在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;
}

阅读(520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~