数据结构——基础7
链表
练习题:已知一个带有表头结点的双向循环链表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