C教材部分章节习题解答.docx
- 文档编号:29813861
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:32
- 大小:22.05KB
C教材部分章节习题解答.docx
《C教材部分章节习题解答.docx》由会员分享,可在线阅读,更多相关《C教材部分章节习题解答.docx(32页珍藏版)》请在冰豆网上搜索。
C教材部分章节习题解答
第2章
一.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A
D
D
D
C
D
A
C
D
C
D
C
D
D
A
二.
1.链
2.顺序存储结构链式存储结构
3.n/2(n-1)/2
4.顺序链式
5.使空表和非空表的算法处理一致
6.由其直接前驱结点的指针域
7.循环
8.L->next==p或p==L->next
9.s->next=p->next;p->next=s;
10.最后头结点
11.基地址和结点大小
12.单链表双链表
13.任意
14.p->next->prior=ff->prior=p
15.头结点
三.
1
2
3
4
5
6
7
8
×
√
√
×
×
√
×
√
第3章
一.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C
B
C
AB
C
B
C
B
D
B
D
C
B
D
D
二.
1.先进先出
2.栈顶指针
3.队尾队头
4.可能的
5.栈
6.s->next=HSHS=s
7.顺序栈链栈
8.后移
9.-1MaxSize-1
10.0空
11.Pop(S)Push(S,5)
12.135102
13.空栈空只含有一个结点
14.O(n)O
(1)
15.A3A1A2
三.
1
2
3
4
5
6
7
8
√
×
√
×
√
×
×
√
binseek
typedefintElemType;
#defineMaxSize128
#include"stdio.h"
typedefstruct
{
ElemTypeelem[MaxSize];
intlength;
}SeqList;
intBinSearch(SeqListL,ElemTypek)
{
intmid,flag=0,low,high,c=0;
low=1;high=L.length;
while(low<=high)
{
mid=(low+high)/2;
c++;
if(k high=mid-1; elseif(k>L.elem[mid]) low=mid+1; else { flag=mid; break; } } printf("c=%d\n",c); returnflag; } main() { SeqListL={{0,13,18,24,35,47,50,62,83,90,115,134},11}; intflag,k; printf("输入要查找的数: "); scanf("%d",&k); flag=BinSearch(L,k); if(flag==0) printf("没有找到! \n"); else printf("%d在第%d个位置上\n",k,flag); } creat_visit /*基本思想: 采用递归建立和遍历二叉树 建立: 先建立根节点,然后建立左、右子树 遍历: 左、右、根 */ /* 测试数据: 输入序列ABD..EH...CF.I..G.. 输出结果为: DHEBIFGCA */ #include #include structnode{ charinfo; structnode*llink,*rlink; };//结点定义 typedefstructnodeNODE; //前序遍历输入建立树,函数返回指向根结点的指针 NODE*create() { charx; NODE*p; scanf("%c",&x); printf("%c",x); if(x! ='.')//如果输入的不是句点,则建立结点 { p=(NODE*)malloc(sizeof(NODE)); p->info=x; p->llink=create(); p->rlink=create(); } else p=NULL; returnp; } //后序遍历树 voidPostOrder(NODE*t) { if(t) { PostOrder(t->llink); PostOrder(t->rlink); printf("%c",t->info); } } //统计叶子节点数目 intCountleaf(NODE*t) { staticintcount=0; if(t) { Countleaf(t->llink); Countleaf(t->rlink); if(t->llink==NULL&&t->rlink==NULL) { count++; } } returncount; } //主函数 main() { NODE*T; printf("Pleaseinputatree: \n"); T=create(); printf("\n"); if(! T) printf("Thisisaemptybinarytree."); else { printf("Theresultofposttraveseis: \n"); PostOrder(T); printf("\n"); printf("Leafcount: \n"); printf("%d",Countleaf(T)); } printf("\n"); } LinkList_21 typedefintElemType; #include #include #include //单链表结点定义 typedefstructLnode { ElemTypedata; structLnode*next; }Lnode,*LinkList; //初始化单链表 voidInit_LinkList(LinkList*L,Lnode**tail) { *L=(Lnode*)malloc(sizeof(Lnode)); (*L)->next=NULL; *tail=*L; } //将数据x插入链表首 voidInsert_LinkList(LinkListL,ElemTypex) { Lnode*p; p=(Lnode*)malloc(sizeof(Lnode));//新结点 p->data=x; p->next=L->next; L->next=p; } //带尾指针的链表,将数据x插入链表尾 voidInsert_LinkList_tail(Lnode**tail,ElemTypex) {Lnode*p; p=(Lnode*)malloc(sizeof(Lnode));//新结点 p->data=x; p->next=(*tail)->next; (*tail)->next=p; (*tail)=(*tail)->next;//更新链尾 } //查找位置为i的结点 Lnode*Get_LinkList(LinkListL,inti) { Lnode*p=L; intj=0; while(p! =NULL&&j { p=p->next; j++; } returnp; } //查找值等于x的结点 intFind_node(LinkListL,ElemTypex) {Lnode*p; intj=1; p=L->next;//p指向首结点 while(p! =NULL&&p->data! =x) {p=p->next; j++; } if(p)//即如果p! =NULL { printf("%d在链表中,是第%d个元素\n",p->data,j); returnj; } else { printf("该数值不在链表里。 \n"); return0; } } //在p指向的结点后插入新结点 voidInsert_front(LinkListL,Lnode*p,ElemTypex) {Lnode*s,*q=L->next; while(q->next! =p) q=q->next; //循环结束后,q指向p的前驱结点 s=(structLnode*)malloc(sizeof(structLnode)); s->data=x; s->next=q->next; q->next=s; } //输出链表 voidOutput_LinkList(LinkListL) { Lnode*p; p=L->next; while(p! =NULL) { printf("%d\t",p->data); p=p->next; } printf("\n"); } //撤销单链表 voidDestroy_LinkList(Lnode**L) {Lnode*p,*p1; p=*L; while(p! =NULL)//将链表中结点逐个释放 {p1=p; p=p->next; free(p1); } *L=NULL; } //例2-3,就地逆置 voidReverse_LinkList(LinkListL) {Lnode*p,*q; p=L->next; L->next=NULL; while(p! =NULL) {q=p; p=p->next; q->next=L->next;//前插法将结点插入链表 L->next=q; } } //例2-4,升序表中,删除值介于min和max的结点 voidDelete_LinkList_minmax(LinkListL,ElemTypemin,ElemTypemax) { Lnode*p,*q,*r; p=L->next; while(p&&p->data<=min) { q=p; p=p->next; } while(p&&p->data { r=p; p=p->next; free(r); } q->next=p; } voidInsert_Linklist_sort(LinkListL)//例2-5,升序排序 { LinkListp,h,t; if(L->next==NULL||L->next->next==NULL) return; p=L->next->next; L->next->next=NULL; while(p) { h=p->next; t=L; while(t->next&&p->data>t->next->data) { t=t->next; } p->next=t->next;//插入结点 t->next=p; p=h; } } //主函数 voidmain() { inti; LinkListL;//指向链表头结点的指针 Lnode*tail,*p;//增加尾结点指针 intx; Init_LinkList(&L,&tail);//初始化单链表 for(i=1;i<=5;i++)//需要再测试表空和只有一个结点的情况 { scanf("%d",&x); Insert_LinkList(L,x); } Insert_Linklist_sort(L); Delete_LinkList_minmax(L,41,67); //Reverse_LinkList(L);//原地逆置链表 Output_LinkList(L);//输出链表结点 /*for(i='a';i<'f';i++)//后插法建立链表 Insert_LinkList_tail(&tail,i); Output_LinkList(L);//输出链表结点 p=Get_LinkList(L,2);//找到第2个结点,用p指向第2个结点 printf("GetNo.%dNode=%c\n",2,p->data); Insert_front(&L,p,'0');//在p指向的结点前插入新结点元素'0',插入后第2个结点为0 Output_LinkList(L);//输出链表结点 //Find_node(L,'c');//找到等于给定值的结点,返回其序号 Destroy_LinkList(&L);//释放链表*/ } Lqueue #include #defineElemTypeint typedefstructQnode {ElemTypedata; structQnode*next; }Qnode; typedefstruct {Qnode*front; Qnode*rear; }LQueue; //链队列的初始化 voidInit_LQueue(LQueue*q) { q->rear=q->front=(Qnode*)malloc(sizeof(Qnode));//生成空间 q->front->next=NULL; //初始化队头、队尾指针 } //入队,将元素x插入到链队列q中,作为q的新队尾 voidEn_LQueue(LQueue*q,intx) { Qnode*p; p=(Qnode*)malloc(sizeof(Qnode));//生成新结点 p->data=x; p->next=NULL;//置新结点的指针为空 q->rear->next=p; q->rear=p; //将队尾指针指向新结点 } //出队,若链队列q不为空,则删除队头元素,并返回其值 intDe_LQueue(LQueue*q,int*x) { Qnode*p; if(q->rear==q->front)//空链队列 return0; p=q->front->next;//取队头 *x=p->data; q->front->next=p->next;//删除队首结点 if(q->front->next==NULL) q->rear=q->front; free(p); return1; } voidmain() {LQueueQ; inti; ElemTypex; Init_LQueue(&Q); for(i=0;i<5;i++) En_LQueue(&Q,i+1); while(De_LQueue(&Q,&x)) {printf("%d->",x); } printf("\n"); } P53_3 #include typedefintElemType; #defineMaxSize50//栈存储空间最大值 //栈顺序存储结构定义 typedefstructSqStack {ElemTypeelem[MaxSize]; inttop; }SqStack; //顺序栈初始化 voidInit_SqStack(SqStack*s) { s->top=-1; } //入栈 voidPush(SqStack*s,ElemTypex) { if(s->top {s->top=s->top+1; s->elem[s->top]=x;//栈未满,栈顶指针递增1,元素x进栈 } else printf("栈已满,不能入栈! \n");//栈满时不能入栈 } //出栈 ElemTypePop(SqStack*s) { ElemTypex; if(s->top! =-1)//若栈未空 { x=s->elem[s->top]; s->top=s->top-1; returnx;//栈未空,栈顶指针递减1,元素x出栈 } else {printf("栈为空,不能出栈! \n");//栈空时不能出栈 return0; } } //栈空返回1 intStack_Empty(SqStackS) { if(S.top==-1)return1; elsereturn0; } voidMultiBase(longn,intB) {//对于任意输入的一个非负十进制整数,输出与其等值的B进制数 ElemTypem; SqStackS;//定义顺序栈类型S Init_SqStack(&S); while(n! =0) {Push(&S,n%B);//入栈 n=n/B;//整除运算 } while(! Stack_Empty(S)) {m=Pop(&S);//出栈 if(m<10) printf("%d",m); else printf("%c",m+87); } printf("\n"); } main() { longn; intB; printf("Inputn,B: "); scanf("%ld%d",&n,&B); MultiBase(n,B); } SeqList_21 typedefintElemType; #defineFOMAT"%d" #defineMaxSize100 #include"stdio.h" //线性表存储结构定义 typedefstruct { ElemTypeelem[MaxSize]; intlength; }SeqList; //初始化线性表 voidInit_SeqList(SeqList*L) { L->length=0; } //创建线性表 voidCreate_SeqList(SeqList*L,intn) { inti; for(i=0;i scanf(FOMAT,&L->elem[i]); L->length=n; } //在顺序表中第i(i: 1~length+1)个元素位置插入新元素x intInsert_SeqList(SeqList*L,inti,ElemTypex) { intj; if(L->length>=MaxSize) { printf("顺序表已满! \n"); return0; } elseif(i<1||i>L->length+1) { printf("插入位置不正确! \n"); return0; } elsefor(j=L->length-1;j>=i-1;j--) { L->elem[j+1]=L->elem[j]; } L->elem[i-1]=x;//插入元素 L->length++;//表长加1 return1; } //删除第i个元素,即下标i-1的元素,删除元素值由x带回 intDelete_SeqList(SeqList*L,inti,ElemType*x) { intj; if(i<=0||i>L->length) { printf("删除元素位置不正确! \n"); return-1; } else { *x=L->elem[i-1]; for(j=i;j { L->elem[j-1]=L->elem[j]; } L->length--;//顺序表长-1 return1; } } //清空顺序表 voidClear_SeqList(SeqList*L) { inti,j; ElemTypex; if(L->length! =0) { for(j=L->length,i=1;i<=j;i++) Delete_SeqList(L,1,&x); } if(L->length==0) printf("顺序表已空! \n"); } //查找顺序表中是否存在与给定值相等的元素,如存在则返回元素下标,否则返回-1 intLocate_SeqList(SeqList*L,ElemTypex) { inti=0; while(i =x) i++; if(i>=L->length) { printf("顺序表中不存在相同值元素\n"); return-1; } else returni; } //主函数 voidmain(void) { inti; SeqListL; //ElemTypex; Init_SeqList(&L);//初始化顺序表 for(i=1;i<=5;i++) Insert_SeqList(&L,i,2*i-1); //Create_SeqList(&L,5);//创建长度为5的顺序表 for(i=0;i printf(FOMAT,L.elem[i]); printf("\n"); Insert_SeqList(&L,4,0);//在第4个元素位置插入新元素0 for(i=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教材 部分 章节 习题 解答