欢迎光临散文网 会员登陆 & 注册

数据结构——基础7

2022-09-13 22:19 作者:技术龙的传人  | 我要投稿

链表

练习题:已知一个带有表头结点的双向循环链表L, 结点结构为prev data next, 其中prev和
next分别是指向其直接前驱和直接后继结点的指针。 现要删除指针p所指的结点, 正
确的语句序列是( )
A p->next->prev = p->prev; p->prev->next = p->prev; free(p);
B p->next->prev = p->next; p->prev->next = p->next; free(p);
C p->next->prev = p->next; p->prev->next = p->prev; free(p);
D p->next->prev = p->prev; p->prev->next = p->next; free(p);

答:D

答:原始链表——c->a->e->b->d

    插入后——c->a->f->e->b->d

    选D

已知头指针h指向一个带头结点的非空单循环链表, 结点结构为 data next, 其
中next是指向直接后继结点的指针, p是尾指针, q是临时指针。 现要删除该链
表的第一个元素, 正确的语句序列是( )
A h->next = h->next->next; q = h->next; free(q);
B q = h->next; h->next = h->next->next; free(q);
C q = h->next; h->next = q->next; if(p != q) p=h; free(q);
D q = h->next; h->next = q->next; if(p == q) p=h; free(q);

答:D

设线性表L=(a1,a2,a3,…,an-2,an-1,an)采用带头结点的单链表保存, 链表中的结点定义如下:

typedef struct node{
    int data;
    struct node *next;
}NODE;
请设计一个空间复杂度为O(1)且时间上尽可能高效的算法, 重新排列L中的各结点, 得到线性表L'=(a1,an,a2,an-1,a3,an-2,…)。 要求:
1) 给出算法的基本设计思想。
2) 根据设计思想, 采用C或C++语言描述算法, 关键之处给出注释。
3) 说明你所设计的算法的时间复杂度。

答:1)

找到中间结点——>后半段逆置——>向前插入

2)

NODE *change(NODE *L){

    NODE *p,*q,*r,*s;//q插入结点,s指向被插入点,r临时指向未插入结点头部

    //步骤一:中间结点

    p = q =L;

    while(q->next == NULL){//p指向下一个,q下一个指向不为空指向下下一个

        p = p->next;

        q = q->next;

        if(q->next == NULL) q = q->next; 

    }

    //步骤二:后半段逆置

    q = p->next;

    p->next = NULL:

    while(q){

        r = q->next;

        q->next = p->next;

        p->next = q;

        q = r;

    }

    //步骤三:向前插入

    s = L->next;

    q = p->next;

    p->next = NULL;//当前是中间结点,算法结束之后是尾结点

    while(q){

        r = q->next;

        q->next = s->next;

        s->next = q;

        s = q->next;

        q = r;

    }

    return L;

}

3)时间复杂度O(n)

栈——限定只能在一端进行插入和删除的线性表


插入:进栈,压栈,入栈,push

删除:出栈,弹栈,退栈,pop

栈的特点:栈的元素先进后出

例题:

解:

A先出d则abcd依次入栈,顺序为d、c出栈,e入栈、出栈,b出栈,f入栈、出栈,a出栈;

B先出a则a入栈、出栈,bcd依次入栈,d、c、b出栈,故选B

C先出c则abc依次入栈,顺序为c、b出栈,d入栈、出栈,a出栈,e入栈、出栈,f入栈、出栈;

D先出b则ab依次入栈,顺序为b出栈,c入栈、出栈,a出栈,d入栈,e入栈、出栈,f入栈、出栈,d出栈。

解:abcd先入栈,d、b、c、a之间和末尾位置,e可以入栈、出栈,故选B

解:栈S1、S2如下所示:

第一次调用函数F(),

1)S1的2、3出栈,则a=2、b=3          2)S2的+出栈        3)3+2=5       4)5入栈S1中

如下所示:

第二次调用函数F(),

1)S1的5、8出栈,则a=5、b=8          2)S2的-出栈        3)8-5=3       4)3入栈S1中

第三次调用函数F(),

1)S1的3、5出栈,则a=3、b=5          2)S2的*出栈        3)5+3=15    4)15入栈S1中

故选B

解:过,选D

队列

环形队列

双端队列

例题:

解:rear指向队尾元素,不是队尾元素的下一个位置,故选B

解:

第一轨道:列车次序8、9  

第二轨道:列车次序4、5、6、7 

第三轨道:列车次序2、3  

第四轨道:列车次序1

故选C

数据结构——基础7的评论 (共 条)

分享到微博请遵守国家法律