实用数据结构基础参考答案 下载本文

B.线性顺序表中包含的元素个数不是任意的

C.线性表中的每个结点都有且仅有一个直接前趋和一个直接后继 D.存在这样的线性表,即表中没有任何结点 (20)在( B )的运算中,使用顺序表比链表好。

A.插入 B.根据序号查找 C. 删除 D.根据元素查找

四.分析下述算法的功能

(1) ListNode *Demo1(LinkList L,ListNode *p)

{ // L是有头结点的单链表

ListNode *q=L->next;

While (q && q->next!=p)

q=q->next;

if (q)

return q;

else

Error(“*p not in L”);

}

(2) void Demo2(ListNode *p,ListNode *q)

{ // p,*q是链表中的两个结点

DataType temp;

temp=p->data;

p->data=q->data;

q->data=temp;

}

解:

(1)返回结点*p的直接前趋结点地址。 (2)交换结点*p和结点*q(p和q的值不变)。

五. 程序填空

(1)已知线性表中的元素是无序的,并以带表头结点的单链表作存储。试写一算法,删除表中所有大于min,小于max的元素,试完成下列程序填空。

Void delete (lklist head; datatype min, max) { q=head->next; while (p!=NULL)

{ if ((p->data<=min ) | | ( p->data>=max ) {q=p; p= p->next ; }

else

9

{ q->next= p->next ;

delete (p) ; p= q->next ; } } }

(2)在带头结点head的单链表的结点a之后插入新元素x,试完成下列程序填空。

struct node { elemtype data; node *next; };

void lkinsert (node *head, elemtype x) { node *s, *p; s= new node ; s->data= x ; p=head->next;

while (p!=NULL) && ( p->data!=a )

____p=p->next ; if (p==NULL)

cout<< \不存在结点a! \ else {_____s->next=p->next______;

___ p->next=s __________; }

}

六.算法设计题

(1)写一个对单循环链表进行遍历(打印每个结点的值)的算法,已知链表中任意结点的地址为P 。 解:

void Show(ListNode *P) { ListNode *t=P; do { printf(\ t=t->rear; }

while (t!=P); }

(2) 对给定的带头结点的单链表L,编写一个删除L中值为x的结点的直接前趋结点的

算法。

解:

void delete(ListNode *L)

10

{

ListNode *p=L,*q;

if(L->next->data==X) {

printf(“值为x的结点是第一个结点,没有直接前趋结点可以删除”); return; }

For(p->next->data!=X;q=p;p=p->next);// 删除指针p所指向的结点

q->next=p->next; delete p;

}

(3) 已知一个单向链表,编写一个函数从单链表中删除自第i个结点起的k个结点。 解:

void Del(node *head,int i,int k) {

node *p,*q; int j; if(i==1)

for(j=1;j<=k;j++) // 删除前k个元素 {

p=head; // p指向要删除的结点 head=head->next;

delete p; } else {

p=head;

for(j=1;j<=i-2;j++)

p=p->next; // p指向要删除的结点的前一个结点 for(j=1;j<=k;j++) {

q=p->next; // q 指向要删除的结点 p->next=q->next;

delete q;

} } }

(4) 有一个单向链表(不同结点的数据域值可能相同),其头指针为head,编写一个函

数计算值域为x的结点个数。

解://本题是遍历单链表的每个结点,每遇到一个结点,结点个数加1,结点个数存储在变量n中。实现本题功能的函数如下:

int counter(head) node *head; { node *p; int n=0;

11

p=head;

while(p!=NULL) { if(p->data==x)

n++; p=p->next; }

return(n); }

(5)有两个循环单向链表,链头指针分别为head1和head2,编写一个函数将链表head1链接到链表head2,链接后的链表仍是循环链表。

解://本题的算法思想是:先找到两链表的尾指针,将第一个链表的尾指针与第二个链表的头结点链接起来,使之成为循环的。函数如下:

node *link (node *head1, *head2) { node *p,*q; p=head1;

while(p->next!=head1)

p=p->next; q=head2;

while(q->next!=head2)

q=q->next; p->next=head2; q->next=head1; return (head1); }

12