关于链表的算法题

1、题目:已知 p 指向双向循环链表中的一个结点,其结点结构为 data、llink、rlink 三个域, 写出算法 change(p),交换 p 所指向的结点和它的前驱结点的顺序。

思路:假设p所指向的结点的前驱结点q,首先应该把q的地址找到,一共要移动六个指针,有7条语句,6条是要移动的,先连后改,改的时候也是要先指向,后改(先下后上),最后三步不能改变顺序。

void Exchange (LinkedList p){ // P是双向循环链表中的一个结点,本算法将p所指结点与其前驱结点交换
    q = p->llink;
    q->llink->rlink = p;
    p->llink = q->llink;
    q->rlink = p->rlink;
    q->llink = p;
    p->rlink->llink = q;
    p->rlink = q;
}

2、题目:线性表(a1,a2,a3,…,an)中元素递增有序且按顺序存储于计算机内。要求设计一算法完成:

(1) 用最少时间在表中查找数值为 x 的元素。

(2) 若找到将其与后继元素位置相交换。

(3) 若找不到将其插入表中并使表中元素仍递增有序。

思路:折半查找,找到就要跟后继元素交换,分别定义low,high,mid,如果x比mid大,则low=mid+1,若x比mid小,则high=mid-1。

void SearchExchangeInsert (ElemType a[]; ElemType x){
    int low=0;
    high=n-l;
    while (low <= high){
        mid= (low+high)/2;
        if (a[mid]==x){
            break;
        }else{
            if (a[mid]x){
                low = mid+l;
            }else{
                high = mid-1;
            }    
        }
    }
    if(a[mid]==x && mid!=n){
        t = a[mid];
        a[mid] = a[mid+1];
        a[mid+1] = t;
    }
    if (low>high){ // 查找不成功
        for (i=n-1;i>high;i--){
            a[i+l] = a[i];
        }
        a[i+1]=x;
    }
}

3、题目:设线性表存于 A[1..size]的前 num 各分量中,且递增有序。请设计一个算法,将 x 插入到线性表的适当位置上,以保持线性表的有序性,并在设计前说明设计思想,最后说明所设计算法的时间复杂度。

void Insert (ElemType A[], int size,ElemType x){
    int low=1,high=num;
    while (low <= high){
        mid=(low+high)/2;
        if(A[mid]--x){
            low = mid+1;
            break;
        }else{
            if (A[mid] > x){
                high = mid-1;
            }else{
                lo w= mid+1;
            }
        }
    }
    for (i=num; i>= low; i--){
        A[i+1] = A[i];
    }
    A[i+1]=x;
}

4、题目:假设一个单循环链表,其结点含有三个域 pre、data、link。其中 data 为数据域; pre 为指针域,它的值为空指针(NIL);link 为指针域,它指向后继结点。请设计算法,将此表改成双向循环链表。

void StoDouble (LinkedList la){
    while (la->link->pre==NULL){
        la->link->pre=la;
        la=la->link;
    }
}

5、题目:给定(已生成)一个带表头结点的单链表,设 head 为头指针,结点的结构为 (data,next),data 为整型元素,next 为指针, 试写出算法:按递增次序输出单链表中各结点的数据元素, 并释放结点所占的存储空间。(要求:不允许使用数组作辅助空间)

思路:要递增,所以得排序。要释放结点,所以要知道这个结点的前一个结点。

void MiniDelete (LinkList head){
    while (head->next != NULL){
        pre = head;
        p = pre->next;
        while (p->next != NULL){
            if (p->next->data < pre->next->data){
                pre = p;
            }
            p=p->next;
        }
        printf(pre->next->data);
        u = pre->next;
        pre->next = u->next;
    }
    free (head);
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值