线性表-TwoLinkList(循环链表练习题)

1:设计一个算法用于判断带头结点的循环双链表是否对称

int judgebalance(pNode **head)
{
    pNode *p,*q;
    p=*head->next;//指向下一个正序
    q=*head->prev;//指向前一个逆序
    /*我的思路
    while(p->data==q->data)//对应的位置值相等
    {
        p=p->next;
        q=q->next;
        if(p==q)//奇数个数指向同一地址
        {
            printf("对称");
            return 1;
            break;
        }
        else if(p->next==q&&q->prev==p)//偶数个数
        {
            printf("对称");
            return 1;
            break;
        }
    }
    return 0;
    */
    //另一种书上的
    while(p!=q&&p->next!=q->prev)
    {
        if(p->data==q->data)
        {
            p=p->next;
            q=q->prev;
        }
        else return 0;
    }
    return 1;
}

2:有两个循环单链表,链表头指针针分别为h1和h2,编写一个函数将链表h2链接到链表h1之后,要求链接后的链表仍保持循环链表形式。

单链表定义

struct Nodet
{
    int a;
    struct Nodet* next;
}

正文

void mergeh(Nodet &h1,Nodel &h2)
{
    Nodet *p,*q,*pp,*qq;
    p=pp=h1;
    q=qq=h2;
    while(p->next!=pp)
    {
        p=p->next;
    }
    p->next=q;
    while(q->next!=qq)
    {
        q=q->next;
    }
    q->next=p;

}

3:设有一个带头结点的循环单链表,其结点值均为正整数、设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该节点从中删除。直到单链表空为止,再删除表头结点。

在不空时循环,每循环一次查找一个最小节点,,记录其前驱节点,删除改点

void de(Nodet &L)
{
    Nodet *p,*pre,*minp,*minpre;
    while(L->next!=L)//表不空 循环
    {
        p=L->next;pre=L;
        minp=p;minpre=pre;
        while(p!=L)//循环一趟,找最小值
        {
            if(p->a<minp->a)//找到
            {
                minp=p;
                minpre=pre;
            }
            pre=p;//找下个节点
            p=p->next;
        }
        printf("%d",minp->a);
        minpre->next=minp->next;
        free(minp);
    }
    free(L);

}

 

上一篇:java – Oracle – 连接与spring框架的池


下一篇:oracle10g精简版安装步骤