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);
}