数据结构C语言版习题及答案第二章.docx

上传人:b****6 文档编号:8063054 上传时间:2023-01-28 格式:DOCX 页数:15 大小:26.51KB
下载 相关 举报
数据结构C语言版习题及答案第二章.docx_第1页
第1页 / 共15页
数据结构C语言版习题及答案第二章.docx_第2页
第2页 / 共15页
数据结构C语言版习题及答案第二章.docx_第3页
第3页 / 共15页
数据结构C语言版习题及答案第二章.docx_第4页
第4页 / 共15页
数据结构C语言版习题及答案第二章.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

数据结构C语言版习题及答案第二章.docx

《数据结构C语言版习题及答案第二章.docx》由会员分享,可在线阅读,更多相关《数据结构C语言版习题及答案第二章.docx(15页珍藏版)》请在冰豆网上搜索。

数据结构C语言版习题及答案第二章.docx

数据结构C语言版习题及答案第二章

习题

2.1选择题

1、线性表的顺序存储结构是一种(A)的存储结构,线性表的链式存储结构是一种(B)的存储结构。

A、随机存取B、顺序存取C、索引存取D、散列存取

2、对于一个线性,既要求能够进行较快的插入和删除,又要求存储结构能够反映数据元素之间的逻辑关系,则应该选择(B)。

A、顺序存储方式B、链式存储方式

C、散列存储方式D、索引存储方式

3、已知,L是一个不带头结点的单链表,p指向其中的一个结点,选择合适的语句实现在p结点的后面插入s结点的操作(B)。

A、p->next=s;s->next=p->next;B、s->next=p->next;p->next=s;

C、p->next=s;s->next=p;D、s->next=p;p->next=s;

4、单链表中各结点之间的地址(CD)。

A、必须连续B、部分地址必须连续

C、不一定连续D、连续与否都可以

5、在一个长度为n的顺序表中向第i个元素(0

A、n-iB、n-i+1C、n-i-1D、i

2.2填空题

1、顺序存储的长度为n的线性表,在任何位置上插入和删除操作的时间复杂度基本上都一样。

插入一个元素大约移动表中的(n/2)个元素,删除一个元素时大约移动表中的((n-1)/2)个元素。

2、在线性表的顺序存储方式中,元素之间的逻辑关系是通过(物理顺序)来体现的;在链式存储方式,元素之间的逻辑关系是通过(指针)体现的。

3、对于一个长度为n的单链表,在已知的p结点后面插入一个新结点的时间复杂度为(o

(1)),在p结点之前插入一个新结点的时间复杂度为(o(n)),在给定值为e的结点之后插入一个新结点的时间复杂度为(o(n))。

4、在双向链表中,每个结点包含两个指针域,一个指向(前驱)结点,另一个指向(后继)结点。

5、对于循环链表来讲,逐个访问各个结点的结束判断条件是(设P为指向结点的指针,L为链表的头指针,则p->next==L)。

2.3读下面的程序段,画出执行过程的示意图及所完成的功能。

1、#defineN6

voidmain()

{ListSqL;

intA[N];

inti,elem;

InitList(L);//初始化函数

for(intj=0;j

scanf("%d",&A[j]);

for(intm=0;m

InsertList(L,m,A[m]);

PrintList(L);//输出函数}

1题示意图

2题示意图

功能:

先初始化一个顺序表,然后根据数组A中元素的顺序创建顺序表,并输出顺序表的全部元素。

2、Lnode*CreateList()

{Lnode*L,*S;

intx,y;

L=malloc(sizeof(Lnode));

L->data=x;

s=malloc(sizeof(Lnode));

s->data=y;

L->next=s;

s->next=NULL;

returnL;

}

功能:

创建一个两个结点的不带头结点的单链表,两个结点的值分别为X和Y,L为单链表的头指针。

2.4算法题

1、编写在两种存储方式下,删除线性表中多余的值相同元素的算法。

解:

顺序存储方式下:

voiddel(ListSq&L)

{inti=0;

while(i

{intj=i+1;

while(j

if(L.e[i]==L.e[j])

{for(intk=j+1;k

L.e[k-1]=L.e[k];

L.len--;

}

elsej++;

i++;

}}

链式存储方式下:

voiddel(Lnode*L)

{Lnode*p=L->next;

while(p->next!

=NULL)

{Lnode*q=p->next;

Lnode*r=p;

while(q!

=NULL)

if(q->data==p->data)

{r->next=q->next;free(q);q=r->next;}

else{r=q;q=q->next;}

p=p->next;

}}

2、已知,顺序表的元素类型为整型,编写将该顺序表分成两个顺序表的算法,一个存放所的奇数元素,另一个存放所的偶数元素。

解:

voidfenSq(ListSqL,ListSq&La,ListSq&Lb)

{intj=0,k=0;

for(inti=0;i

if(L.e[i]%2==0)

{Lb.e[j]=L.e[i];j++;}

else{La.e[k]=L.e[i];k++;}

La.len=k;

Lb.len=j;

}

3、编写一个统计单循环链表的结点个数的算法。

解:

intcount(Lnode*L)

{Lnode*p=L->next;

intn=0;

while(p!

=L)

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

returnn;

}

4、编写删除有序单链表中元素值大于min并且小于max的全部元素的算法。

如果给定的表是无序的,如何改写上面的算法。

解:

voiddel4(Lnode*L,Elemtypemin,Elemtypemax)

{Lnode*q,*s,*p;

p=L->next;q=L;

while(p!

=NULL&&p->date<=min)

{q=p;p=p->next;}

if(p!

=NULL)//表示存在大于min的结点,最后一个小于等于min的结点为q结点

{

while(p!

=NULL&&p->date

p=p->next;

if(p!

=NULL)//表示存在大于等于max的结点,既p结点

while(q->next!

=p)//删除q的后继结点到p的前驱结点为止的所有结点

{s=q->next;q->next=s->next;free(s);}

else

{s=q->next;q->next=NULL;//q以后的结点全部要删除

while(s!

=NULL)

{p=s->next;free(s);s=p;}}}

5、用顺序表来求集合的并集、交集和差集,也可以用链表来实现以上操作。

(作为上机实践题目)

#include

typedefintElemtype;

#definemaxlen100

#defineN30

structListSq

{

Elemtypee[maxlen];

intlen;

};

//顺序表的创建算法

voidCreate_Sq(ListSq&L,ElemtypeA[],intn)

{

inti;

for(i=0;i

L.e[i]=A[i];

L.len=n;

}

//顺序表的输出算法

voidPrintList(ListSqL)

{

printf("当前集合为:

\n");

for(inti=0;i

printf("%d\t",L.e[i]);

printf("\n");

}

voidbingji(ListSqL1,ListSqL2,ListSq&L3)

{

for(intk=0;k

L3.e[k]=L1.e[k];

L3.len=L1.len;

for(inti=0;i

{intj=0;

while((j

=L1.e[j]))

j++;

if(j>=L1.len)

{

L3.e[L3.len]=L2.e[i];

L3.len++;

}

}

}

voidjiaoji(ListSqL1,ListSqL2,ListSq&L3)

{

intk=0;

for(inti=0;i

{

intj=0;

while((j

=L2.e[j]))

j++;

if(j

L3.e[k++]=L1.e[i];

}

L3.len=k;

}

voidchaji(ListSqL1,ListSqL2,ListSq&L3)

{

intk=0;

for(inti=0;i

{

intj=0;

while((j

=L2.e[j]))

j++;

if(j>=L2.len)

L3.e[k++]=L1.e[i];

}

for(intm=0;m

{

intn=0;

while((n

=L1.e[n]))

n++;

if(n>=L1.len)

L3.e[k++]=L2.e[m];

}

L3.len=k;

}

//主函数

voidmain()

{

ListSqL1,L2,L3;

L3.len=0;

intA[N];

intm,n,c;

printf("请输入线性表L1的元素个数:

\n");

scanf("%d",&m);

printf("请输入线性表L1的元素:

\n");

for(intj=0;j

scanf("%d",&A[j]);

Create_Sq(L1,A,m);

PrintList(L1);

printf("请输入线性表L2的元素个数:

\n");

scanf("%d",&n);

printf("请输入线性表L2的元素:

\n");

for(intw=0;w

scanf("%d",&A[w]);

Create_Sq(L2,A,n);

PrintList(L2);

while

(1)

{

printf("请按提示进行输入:

\n");

printf("实现两个集合的并集,请输入1:

\n");

printf("实现两个集合的交集,请输入2:

\n");

printf("实现两个集合的差集,请输入3:

\n");

printf("退出,请输入4:

\n");

scanf("%d",&c);

switch(c)

{

case1:

{

bingji(L1,L2,L3);

PrintList(L3);

break;

}

case2:

{

jiaoji(L1,L2,L3);

PrintList(L3);

break;

}

case3:

{

chaji(L1,L2,L3);

PrintList(L3);

break;

}

case4:

return;

default:

printf("输入有误!

\n");

}

}

}

6、用循环单链表来实现约瑟夫问题。

(作为上机实践题目)

#include

#include

typedefstructLnode{

intdata;

Lnode*next;

}*Link;

voidCreateList(Link&L,intn)

//建立一个n个结点的循环单链表

{

inti;Lnode*p,*s;

s=(Lnode*)malloc(sizeof(Lnode));

s->data=1;

L=p=s;

for(i=2;i<=n;i++)

{

s=(Lnode*)malloc(sizeof(Lnode));

s->data=i;

p->next=s;

p=s;

}

p->next=L;

}

voidDeleteList(Link&L,Lnode*p,Lnode*q)//从循环单链表中删除结点p

{

q->next=p->next;//修改结点的指针域

free(p);//释放p结点所占存储空间

}

voidjosephus(Link&L,ints,intm)

{

Lnode*p,*q;

p=L;

for(inti=1;i<=s-1;i++)p=p->next;

q=p->next;

while(q->next!

=p)q=q->next;

while(p->next!

=p)

{

for(intj=1;j

{

q=p;p=p->next;

}

printf("%d,",p->data);

DeleteList(L,p,q);

p=q->next;

}

printf("%d",p->data);

printf("\n");

}

voidmain()

{

LinkL=NULL;

intm,n,s;

printf("请输入围圈人数、报数的开始位置和报数的上限\n");

scanf("%d,%d,%d",&n,&s,&m);

if((m>1000)||(n>1000))printf("输入值m或n不合法!

\n");

else

if(s>n)printf("输入值s和n不合法!

\n");

else

{

CreateList(L,n);

printf("\n");

josephus(L,s,m);

}

}

7、某百货公司对仓库中的库存电视进行管理时,按其价格从低到高的次序构成一个循环单链表来保存信息,每个结点包含价格、数量和指针三个域。

现新到m台价格为h的电视机,编写修改原信息链表的算法。

(作为上机实践题目)

#include

#include

structElemtype

{

floatjiage;

intshuliang;

};

structLnode

{

Elemtypedata;

structLnode*next;

};

//单链表的后插入创建算法

voidRcreate(Lnode*L,ElemtypeA[],intn)

{

inti;

Lnode*p,*s;

p=L;

for(i=0;i

{

s=(Lnode*)malloc(sizeof(Lnode));

s->data=A[i];

s->next=p->next;

p->next=s;

p=s;

}

}

//单链表的输出算法

voidprintList(Lnode*L)

{Lnode*p;

if(L->next==L)

printf("单链表为空!

\n");

else

{

p=L->next;

printf("当前仓库中库存的电视相关信息为:

\n");

printf("价格\t\t数量\n");

while(p->next!

=L)

{

printf("%f\t",p->data.jiage);

printf("%d\n",p->data.shuliang);

p=p->next;

}

printf("%f\t",p->data.jiage);

printf("%d\n",p->data.shuliang);

}

}

voidInsert(Lnode*L,Elemtypeelem)

{

Lnode*s;

s=(Lnode*)malloc(sizeof(Lnode));

s->data=elem;

if(L->next==L)

{

s->next=L->next;

L->next=s;

}

else

{

Lnode*p=L,*q=L->next;

while((q!

=L)&&q->data.jiagedata.jiage)

{

p=q;

q=q->next;

}

s->next=q;

p->next=s;

}

}

//主函数

voidmain()

{Lnode*L;

intn;

ElemtypeA[50],elem;

printf("请输入仓库中库存的电视的台数:

\n");

scanf("%d",&n);

printf("按价格从低到高输入电视信息:

\n");

for(intj=0;j

{

scanf("%f,",&A[j].jiage);

scanf("%d",&A[j].shuliang);

}

L=(Lnode*)malloc(sizeof(Lnode));

L->next=L;

Rcreate(L,A,n);

printList(L);

printf("请输入新到的电视相关信息!

\n");

printf("请输入价格:

");

scanf("%f",&elem.jiage);

printf("请输入数量:

");

scanf("%d",&elem.shuliang);

printf("\n");

Insert(L,elem);

printList(L);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1