西电《软件技术基础》上机大作业答案解析
《软件技术基础》习题解答
第二章2.1 什么是数据结构?它对算法有什么影响?数据结构是指同一数据对象中各数据元素间存在的关系。
数据结构对算法的影响:算法的实现必须借助程序设计语言中提供的数据类型及其运算。
一个算法的效率往往与数据的表达形式有关,因此数据结构的选择对数据处理的效率起着至关重要的作用。
它是算法和程序设计的基本部分,它对程序的质量影响很大。
2.2何谓算法?它与程序有何区别?广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。
计算机算法是通过计算机能执行的算法语言来表达的。
和程序的区别:一个程序包括两个方面的内容:(1)对数据的描述,即数据结构。
(2)对操作的描述,即算法。
所以算法是程序的一个要素。
2.12试编写算法求已知单链表长度,并考虑表空的情况。
p = headi = 0While(p!=nil) //表不为空P<-- next(p)//移动到下一个元素i++End(while)Return i //返回数据的个数head2.14 已知一循环链表中数值已按递增有序排列现要插入一个新结点,并使插入一个新节点,并使插入后链表仍为有序序列Link ST (head ,b){Get node (p);data(p)←b;If(head=nil) then{ head←head;head←p;return;}If(b<data (head)) then {next(p)←head ;head←p;return;}q←headWhile(next(q)≠nil)and(b>data(next(q)))doq←head(q)If(next(q)≠nil)then{next(p)←next(q);next(q)←p;}Else{ next(q)←p;next(p)←nil;}return}2.30 设一颗二叉树其中序和后序遍历为中序:BDCEAFHG后序:DECBHGFA答案:ABCDEFHG2.33.给定一组权值W={8,2,5,3,2,17,4},画出由此生成的哈夫曼树。
2017西电电院软件技术基础上机大作业答案
1.若在矩阵Am×n中存在一个元素A[i][j],其满足A[i][j]是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。用二维数组存储矩阵Am×n,设计算法求出矩阵中所有马鞍点。(文件夹:找马鞍点)
2.A和B是两个n×n阶的对称矩阵,以行为主序输入对称矩阵的下三角元素,压缩存储存入一维数组A和B,编写一个算法计算对称矩阵A和B的乘积,结果存入二维数组C。(文件夹:对称矩阵相乘)
2.采用二叉链表结构存储一棵二叉树,编写一个算法统计该二叉树中结点总数及叶子结点总数。(文件夹:统计二叉树结点)
实验六图
一、实验目的
1.熟悉图的邻接矩阵和邻接表的存储结构
2.熟悉图的邻接矩阵和邻接表的建立算法
实验五树
一、实验目的
1.熟悉二叉树的链式存储结构
2.掌握二叉树的建立、深度优先递归遍历等算法
3.能够利用遍历算法实现一些应用
二、实验内容
1.已知二叉树采用二叉链表存储结构,如果左、右子树非空,且左子树根结点大于右子树根结点,则交换根结点的左、右子树。即按要求交换二叉树及子树的左、右子树。(文件夹:交换左右子树)
二、实验内容
1.串采用顺序存储结构,编写朴素模式匹配算法,查找在串中是否存在给定的子串。(文件夹:模式匹配)
思路6:朴素模式匹配对于字串和子串逐个字符进行匹配,在某一位置如果该字符与子串中的字符不相等时,那么进行回溯,子串到开始位置,字串到下一位置重新开始遍历,直到遍历结束,判断在该字串中是否存在给定的子串。
西电—软件大作业
软件技术基础大作业电子工程学院2016.121、//单链表逆置void invert(linklist*head) {linklist*p, *q, *r;//p指向前一个结点,q指向p后的结点,r用于保存q指针域的值p = head->next; //p指向第一个结点q = head->next->next; //q指向第二个结点head->next->next = NULL;while (q != NULL) {r = q->next;//保存q指针域的值,接下来会将此值赋予pq->next = p; //修改q的指针域,使其指向p所指结点,以达到逆置的目的p = q;//p 后移q = r;//q后移}head->next = p;}分析:2、//按字母、数字、其它字符分解单链表void resolve(linklist*head, linklist*letter, linklist*digit, linklist*other) { linklist *p;while (head->next != NULL) {p = head->next; //p指向第一个节点head->next = head->next->next; //缩短循环链表if ((p->data >= 'A'&&p->data <= 'Z') || (p->data >= 'a'&&p->data <= 'z')) insert(letter, p);elseif (p->data >= '0'&&p->data <= '9')insert(digit, p);else insert(other, p); //判断字母、数字和其它字符}}分析:3、//判字符串是否中心对称int symmetry(linklist*head, stack*s) {int l = length(head);int n = l / 2;int x;linklist*p = head->next;for (int i = 1; i <= n; i++) {push(s, p->data);//把单链表的前一半元素压入堆栈p = p->next;}if (l % 2 == 1) p = p->next;//当链表长度为奇数时while (p->next != NULL) {x = pop(s);if (x == p->data)p = p->next;elsereturn 0;}return 1;}分析:4、//入队void enqueue(qu *sq, datatype x) {for (int i = 0; i < m; i++) {sq->sequ[i] = x;}}//出队datatype *dequeue(qu *sq){datatype *temp;if (sq->quelen == 0){printf("queue is empty\n"); return NULL;}else {temp = (datatype*)malloc(sizeof(datatype));sq->quelen--;*temp = sq->sequ[(sq->rear - sq->quelen + m) % m];return (temp);}}分析:5、//顺序串的朴素模式匹配int Index(seqstring*S, seqstring*subS) {int i = 1, j = 1; //位序从1开始while (i <= S->len&&j <= subS->len)if (S->str[i - 1] == subS->str[j - 1]){i++; j++;} //继续比较后面的字符else{i = i - j + 2; j = 1;} //本趟不匹配,设置下一趟匹配的起始位序if (j >subS->len) return(i - subS->len); //匹配成功elsereturn(-1); //匹配不成功}分析:6、//添加删除子串算法void strDelete(seqstring*S, int pos, int len) {char temp[maxsize];if (pos>= 1 &&len<= S->length - len + 1) {strncpy_s(temp, S->str, pos - 1);//strncpy_s与strncpy具有相同的功能,用于将源字符串复制到目的字符串strcpy_s(temp + pos - 1,maxsize,S->str + pos + len - 1);//strcpy_s与strcpy具有相同的功能strcpy_s(S->str,maxsize, temp);S->length = S->length - len;}}分析:7、//希尔排序void shellsort(rectype r[], int d[]){int i, j, k, h;rectype temp;int maxint = 32767;for (i = 0; i<D1; i++)r[i].key = -maxint;//设置T个监视哨k = 0;do {h = d[k];//取一趟的增量for (i = h + D1; i<N + D1; i++){temp =r[i];j = i - h;while (temp.key<r[j].key){r[j + h] =r[j];j = j - h;}r[j + h] = temp;}//组内直接插入法排序print(r, N);//输出一趟的排序结果k++;} while (h != 1);}分析:8、//折半查找索引表,块内顺序查找int blksearch(record r[], index idx[], keytype k, int n) {int i, low = 0, high = n - 1, mid, bh, find = 0;//折半查找索引表while (low <= high && !find){mid = (low + high) / 2;if (k<idx[mid].key)high = mid - 1;elseif (k>idx[mid].key)low = mid + 1;else{high = mid - 1;find = 1;}}if (low<n){i = idx[low].low;//块的起始地址bh = idx[low].high;//块的终止地址}//块内顺序查找while (i<bh&&r[i].key != k)i++;if (r[i].key != k)i = -1;return i;}分析:9、//双向起泡排序void dbubblesort(sequenlist r[], int n){int i = 1, j, noswap = 1;sequenlist temp;while (noswap) {noswap = 0;for (j = n - i + 1; j >= i + 1; j--)if (r[j].key<r[j - 1].key){noswap = 1;temp =r[j];r[j] =r[j - 1];r[j - 1] = temp;}for (j = i + 1; j <= n - i; j++)if (r[j].key>r[j + 1].key){noswap = 1;temp =r[j];r[j] =r[j + 1];r[j + 1] = temp;}for (int k = 1; k <= n; k++)printf("%5d", r[k].key);printf("\n");i++;}}分析:10。
西安电子科技大学机电工程学院 软件技术大作业
西安电子科技大学机电工程学院软件技术大作业任课老师李凯上机报告一、上机目的1.熟悉线性表,链表,队列,二叉树等数据结构2.学习利用C语言实现多种数据结构的建立和多种操作(插入,删除等)3.在编程过程中学习程序的调试方式二、上机内容假设称正读反读都相同的字符序列为回文。
例如,‘abba’,‘abcba’都是回文,‘ababab’不是回文,试编写程序判别从标准输入读入的以’@’为结束符的字符序列是否是回文。
三·设计说明5题1)用一维数组实现。
(当然可以参考用课件中的队列的方法,但就算法繁简来说,用数组实现更为简单高效)2)基本思想:设数组长度为n。
分别将a[0]与a[n-1],a[1]与a[n-2],a[2]与a[n-3]……比较,判断是否相等,相等则计数变量k加1,否则退出循环。
最后判断k值。
若是回文,则k应该等于[n/2],否则就不是回文。
3)输入说明:以$输入为结束标志三、调试分析1.调试所遇到问题1)编译时,头文件包含不全2)逻辑一般没有错误,而问题多出在实际实现过程与自己想法间的差距。
例如:2题,判断条件(s!=r)&&(r->next!=s)。
我想实现的是当结点数为偶数时,头尾两部分交换结束的条件是s=r;当为奇数时,结束的条件是s跑到r的后面。
因此在写程序初,逻辑运算用的是||(或),即二种情况中的一种,结果运行时怎么都不正确。
后来在老师帮助下才找到错误。
3)对于算法实际运行的方式理解不到位。
在做第6题时认为该题应该比较简单,因为二叉树的建立和遍历课本上都有现成的算法,自己只需添加相应的判断条件即可。
结果调试发现怎么做都不正确,后来仔细想递归算法的细节才注意到统计变量递归一次又从头开始统计,所以结果始终是结点数1,叶子数0。
改进作法是将统计量变为一个初值为0的参数,发现也是不行的。
最后只能改为全局变量。
4)输入方式不正确。
在输入时没有注意输入方式,随便加空格,使得运行结果错误。
西电软件技术基础大作业
西电软件技术基础大作业现有若干学生的学籍档案信息,要求编写一个应用软件实现对其进行日常管理,以实现学生档案信息的插入和删除,并能根据学号查询.#include<stdio.h>#include<stdlib.h>#include<string>typedef struct student{char ID[10];char name[10];char sex[3];int age;char addr[30];struct student *next;}stu;void Input(stu *&head){stu *temp,*current;temp=(stu *)malloc(sizeof(stu));printf("输入学生信息:\n");printf("学号\t姓名\t性别\t年龄\t地址\t\n");fflush(stdin);scanf("%s%s%s%d%s",temp->ID,temp->name,temp->sex,&temp->age,temp->addr);temp->next=NULL;if(head==NULL){head=(stu *)malloc(sizeof(stu));head->next=temp;}else{current=head->next;while(current->next)current=current->next;current->next=temp;}printf("添加成功\n");system("pause");}void FindByID(stu *&head){if(head==NULL){printf("数据为空\n");system("pause");return ;}else{stu *current =head->next;bool flag=0;char a[10];printf("输入要查询的学号:\n");fflush(stdin);scanf("%s",a);do{if(strcmp(current->ID,a)==0){flag=1;break;}current=current->next;}while(current!=NULL);if(flag){printf("学号:%s 姓名:%s 性别:%s 年龄:%d 地址:%s\n",current->ID,current->name,current->sex,current->age,current->addr);system("pause");}else{printf("没有找到\n");system("pause");}}}void FindByName(stu *&head){if(head==NULL){printf("数据为空\n");system("pause");return ;}else{stu *current =head->next;bool flag=0;char a[10];printf("输入要查询的姓名:\n");fflush(stdin);scanf("%s",a);do{if(strcmp(current->name,a)==0){flag=1;break;}current=current->next;}while(current!=NULL);if(flag){printf("学号:%s 姓名:%s 性别:%s 年龄:%d 地址:%s\n",current->ID,current->name,current->sex,current->age,current->addr);system("pause");}else{printf("没有找到\n");system("pause");}}}void Delete(stu *&head){if(head==NULL){printf("数据为空\n");system("pause");return ;}else{ stu *current =head->next;stu *prev=NULL;char a[10];printf("输入要删除的学号:\n");fflush(stdin);scanf("%s",a);while(current!=NULL){if(strcmp(current->ID,a)==0)break;prev=current;current=current->next;}if(prev==NULL){head->next=current->next;free(current);}else{prev->next=current->next;free(current);}printf("删除成功\n");system("pause");}}void Show(stu *&head){stu *current =head->next;if(current==NULL){printf("数据为空\n");system("pause");return ;}printf("学号\t姓名\t性别\t年龄\t地址\t\n");while(current!=NULL){printf("%s\t%s\t%s\t%d\t%s\n",current->ID,current->name,current->sex,current->age,current->ad dr);current=current->next;}system("pause");}void Modify(stu *&head){if(head==NULL){printf("数据为空\n");system("pause");return ;}bool flag=0;char a[10];printf("输入要查询的学号:\n");fflush(stdin);scanf("%s",a);stu *current=head->next;do{if(strcmp(current->ID,a)==0){flag=1;break;}current=current->next;}while(current!=NULL);if(flag){printf("学号:%s 姓名:%s 性别:%s 年龄:%d 地址:%s\n",current->ID,current->name,current->sex,current->age,current->addr);printf("请重新输入该学生信息:\n");printf("学号\t姓名\t性别\t年龄\t地址\t\n");scanf("%s%s%s%d%s",current->ID,current->name,current->sex,current->age,current->addr); printf("修改成功\n");printf("pause");}else{printf("没有找到\n");system("pause");}}void Print(){system("cls");printf(" 请选择功能(按0退出)\n");printf(" 1------添加学生\n");printf(" 2------通过学号查询学生\n");printf(" 3------通过姓名查询学生\n");printf(" 4------删除学生\n");printf(" 5------修改学生\n");printf(" 6------显示所有学生\n");}int main(){char ch;stu *head=NULL;do{Print();fflush(stdin);ch=getchar();//system("cls");switch(ch){case '1':Input(head);break;case '2':FindByID(head);break; case '3':FindByName(head);break; case '4':Delete(head);break;case '5':Modify(head);break; case '6':Show(head);break;}}while(ch!='0');}。
《计算机软件技术基础》参考答案A
《计算机软件技术基础》参考答案A一、单项选择题(每空1分,共50分)1-5 CBCBD 6-10 ADDCB11-15 ACABB 16-20 BLJCI21-25 CCABC 26-30 BADAB31-35 BCDBA 36-40 DDCDA41-45 DDCAC 46-50 BBCAB评分标准:本题每空1分,多选、少选、错选均不得分。
二、本题10分(1) v != NULL或v(2) x > v->val 或x != v->val(3) p->next(4) u->next(5) head->next评分标准:本题10分,每空2分,在(3)-(5)中未写出next扣1分三、本题10分(1) A!=NULL && B!=NULL(2) A->data==B->data(3) B=B->next;(4) A!=NULL(5) last->next=NULL;评分标准:本题10分,每空2分,在(2)中未写出data扣1分,在(3)和(5)中未写出next扣1分四、本题10分解:(1) A、B、C三个进程之间存在互斥的制约关系。
因为打印机属于临界资源,必须一个进程使用完之后另一个进程才能使用。
(2)mutex:用于互斥的信号量,初值为1。
各进程的代码如下:进程A 进程B 进程C... … ...... … ...P(mutex) P(mutex) P(mutex)申请打印机申请打印机申请打印机使用打印机使用打印机使用打印机V(mutex) V(mutex) V(mutex)… … …评分标准:本题10分,(1)题3分,(2)题7分,其中给出信号量含义和初值1分,三个进程代码各2分五、本题10分解:FIFO淘汰算法:内存块为3时,缺页中断(或称缺页次数、页面故障)为9;内存块为4时,缺页中断为10。
LRU淘汰算法:内存块为3时,缺页中断为10评分标准:本题10分,FIFO淘汰算法两种情况各3分,LRU淘汰算法1分,要求有分析过程六、本题10分解:段式存储管理的地址转换过程为:(1)根据逻辑地址中的段号查段表的相应栏目;(2)根据段内地址<段长度,检查地址是否越界;(3)若不越界,则绝对地址=该段的主存起始地址+段内地址。
电子科技大学20春《软件技术基础》在线作业1.doc
1.下列操作中不是数据操作的是()。
A.删除B.排序C.构造D.查找【参考答案】: C2.在计算机系统中,操作系统是()。
A.处于裸机之上的第一层软件B.处于硬件之下的低层软件C.处于应用软件之上的系统软件D.处于系统软件之上的用户软件【参考答案】: A3.栈中输入A,B,C,D,E,F六个字符,出栈顺序是()。
A.ABCDEFB.FEDCBAC.AFECBD.FABCDE【参考答案】: B4.C语言的基本数据类型不包括A.doubleB.intC.floatD.char【参考答案】: A5.下列哪个不是线性结构()。
A.链表B.队列C.串D.树【参考答案】: D6.图的遍历有()。
A.广度优先搜索遍历B.深度优先搜索遍历C.前序遍历D.后序遍历【参考答案】: AB7.内存分配常采用的策略有()。
A.首次适用算法B.最佳适用算法C.最坏适用算法D.中等适用算法【参考答案】: ABC8.C语言的基本数据类型包括()。
A.doubleB.intC.floatD.char【参考答案】: BCD9.进程管理应具有以下功能()。
A.进程控制B.进程同步C.进程通信D.进程调度【参考答案】: ABCD10.对作业调度算法的选择要考虑三个目标是()。
A.尽量提高系统的作业吞吐量,即每天处理尽可能多的作业B.尽量使CPU 和外部设备保持忙碌状态,以提高资源利用率C.对各种作业公平合理,使用有用户都满意D.减少作业运行次数【参考答案】: ABC11.数据结构的三层次是()。
A.数据的逻辑结构B.数据的存储结构C.数据的操作集合D.非线性结构【参考答案】: ABC12.进程控制原语包括()。
A.创建原语B.撤销原语C.阻塞原语D.唤醒原语【参考答案】: ABCD13.作业的状态分为()。
A.进入状态B.后备状态C.运行状态D.完成状态【参考答案】: ABCD14.数据的逻辑结构包括()。
A.线性结构B.非线性结构C.算数结构D.几何结构【参考答案】: AB15.分时系统中作业的控制有哪些()。
软件技术基础 习题答案
软件技术基础习题答案软件技术基础习题答案在学习软件技术基础的过程中,习题是非常重要的一种学习方式。
通过解答习题,我们可以巩固所学的知识,提高自己的理解能力和解决问题的能力。
下面是一些常见的软件技术基础习题及其答案,供大家参考。
1. 什么是软件开发生命周期?它包括哪些阶段?答:软件开发生命周期是指软件从开始开发到最终交付使用的整个过程。
它包括需求分析、系统设计、编码、测试、部署和维护等阶段。
2. 什么是面向对象编程?面向对象编程有哪些特点?答:面向对象编程是一种编程范式,它将程序中的数据和操作封装成对象,并通过对象之间的交互来实现程序的功能。
面向对象编程的特点包括封装、继承和多态。
3. 什么是数据结构?请举例说明一种常见的数据结构。
答:数据结构是指组织和存储数据的方式。
常见的数据结构有数组、链表、栈和队列等。
以数组为例,它是一种线性数据结构,可以存储多个相同类型的元素。
4. 什么是算法?请举例说明一种常见的算法。
答:算法是指解决问题的一系列步骤。
常见的算法有排序算法、搜索算法和图算法等。
以排序算法为例,冒泡排序是一种常见的排序算法,它通过比较相邻元素的大小来实现排序。
5. 什么是数据库?请举例说明一种常见的数据库类型。
答:数据库是指存储和管理数据的系统。
常见的数据库类型有关系型数据库和非关系型数据库。
以关系型数据库为例,MySQL是一种常见的关系型数据库,它使用表格的形式来存储数据。
6. 什么是网络编程?网络编程有哪些常用的协议?答:网络编程是指通过网络进行数据传输和通信的编程方式。
常用的网络协议有TCP/IP协议和HTTP协议。
TCP/IP协议是一种传输协议,用于保证数据的可靠传输;HTTP协议是一种应用层协议,用于在客户端和服务器之间传输超文本。
7. 什么是操作系统?操作系统有什么作用?答:操作系统是计算机系统中的核心软件,负责管理和控制计算机的硬件和软件资源。
操作系统的作用包括管理内存、文件和进程,提供用户界面和系统调度等。
西电软件技术基础大作业
软件技术基础大作业通讯录管理的设计一、程序设计目的通过对通讯录管理链表的课程设计,加深对程序设计的理解,熟练掌握和加深c语言的基本知识和语法规范,同时更进一步地理解数据结构对单链表知识的应用。
二、实验内容设计一个含有多个菜单项的程序,菜单项内容如下:1.通讯链表的建立2.通讯者结点的插入3.通讯者结点的查询4.通讯者结点的删除5.通讯录链表的输出0.退出管理系统三、算法分析首先,应运用c语言中结构体的知识。
把通讯者的各项信息储存到结构体的链表中,定义一个新的结构体类型struct(struct是声明结构体时所必须使用的关键字)它向编译系统声明这是一个“结构体类型”,它包括num, name ,phone 等不同类型的数据项。
其次运用数据结构中线性表的知识。
线性表的存储结构分为线性表的线性存储结构和线性表的链式存储结构,线性表的顺序存储结构是指用一组地址连续的存储单元一次存储线性表的数据元素。
线性表的链式存储结构则是通过指针反映元素之间的关系,不要求逻辑上相邻的元素在物理位置上也相邻,所以该方法可以克服顺序表的一些缺点。
所以本次应运用线性链表的链式存储结构。
线性链表的链式存储结构又分为单链表、循环链表和双链表,本次运用单链表的知识。
四、模块分析1. 通讯链表的建立建立单链表有两种方法,头插入法和尾插入法。
头插入法是将每次新插入的结点插入在链表的表头,而尾插入法是将新插入的结点插入到链表的表尾。
在这个通讯录的建立中将采用尾插入法建立链表。
2. 链表的插入链表结点的插入是要求将一个通讯录数据结点按其编号的顺序插入有序通讯录表的相应位置,以保持其有序性。
使用两个指针变量分别指向刚访问的结点和下一个结点,寻找插入结点的位置,其中一个指向待插入位置的前一个结点。
3. 链表的查询首先输入要查找的通讯录的编号或姓名,从表头顺序访问表中结点,查找成功则返回指向查找的通讯者信息的结点,否则返回一个空的指针。
4. 单链表的删除输入要查找的通讯录的编号或者姓名,从表头顺序访问表中结点,查找成功则返回指向查找的通讯者信息的结点,删除结点即可。
西电 C++ 面向对象程序设计 软件技术基础 课后答案
习题3 四、1int compare(SeqList*La,SeqList*Lb){int i;i=1;while(i<=La->last&&i<=Lb->Last&& La->data[i]==Lb->data[i]) i++;if(i<=La->last&&j>Lb->last|| La->data[i]>Lb->data[i]) return 1; //A>B if(i>La->last&&j<=Lb->last|| La->data[i]<Lb->data[i]) return -1; //A<B if(i>La->last&&j>Lb->last) return 0; //A=B}四、2 (1)顺序表int invert(SeqList*L){int i=1;datatype temp;while(i<=L->last/2){temp=L->data[i];L->data[i]=L->data[L->last-i+1];L->data[L->last-i+1]=temp;}}(2)链表void invert (linklist*head){linklist*p,*q,*r;p=head->next;q=p->next;while(q!=NULL){r=q->next;q->next=p;p=q;q=r;}head->next->next=NULL;head->next=p;}四、5void mergelist(Linear_list*La,Linear_list*Lb,Linear_list*&Lc){Lc=(Linear_list*)malloc(sizeof(Linear_list)); //产生C表的头结点头插法Lc->next=NULL;while(La->next!=NULL&&Lb->next!=NULL) //La、Lb均非空if(La->next->data<=Lb->next->data){p=La->next;La->next=La->next->next;insert(Lc,p);}else{p=Lb->next;Lb->next=Lb->next->next;insert(Lc,p);}while(La->next!=NULL){p=La->next;La->next=La->next->next;insert(Lc,p);}while(Lb->next!=NULL){p=Lb->next;Lb->next=Lb->next->next;insert(Lc,p);}}//O(Length(La)+Length(Lb))void insert(Linear_list*Lc,Linear_list*p){p->next=Lc->next;Lc->next=p;}//O(1)四、8void deleteFront(Link*s){Link*p=s,*q;while(p->next->next!=s)p=p->next;q=p->next;p->next=s;free(q);}习题4 四、1int symmetry(linklist*head,stack*s)//具有头结点的单链表中存放有一个字符串,每个结点的数据域存放一个字符。
西电软计技术上机
西安电子科技大学机电工程学院软件技术大作业任课老师许威上机报告一、上机目的1.熟悉线性表,链表,队列,二叉树等数据结构2.学习利用C语言实现多种数据结构的建立和多种操作(插入,删除等)3.在编程过程中学习程序的调试方式二、上机内容一共完成5题——1,2,4,5,61题:设有一个由正整数组成的无序单链表,编写完成下列功能的算法:①找出最小值结点,且打印该数值;②若该数值是奇数,则将其与直接后继结点的数值交换;③若该数值是偶数,则将其直接后继结点删除。
2题:编一程序:①建立一个数据域为1至10的带头结点的链表;②将此链表就地逆转。
4题:某百货公司仓库中有一批电视机,试按价格从高到底的次序建立一个循环链表,每个结点有价格、数量和指针三个域。
现新到10台价格为4000元的电视机,修改原链表并输出修改后链表的所有内容。
5题:假设称正读反读都相同的字符序列为回文。
例如,‘abba’,‘abcba’都是回文,‘ababab’不是回文,试编写程序判别从标准输入读入的以’@’为结束符的字符序列是否是回文。
6题:试设计一个程序,求二叉树的结点数目和叶子结点数目。
三、设计说明1题1)用带头结点的单链表是实现2)结点声明typedef struct node{int data;struct node *next;}linklist3)共定义了5个函数CREAT——建立单链表函数DELETE——删除结点函数SEARCH——查找数据域最小的结点函数基本思想:定义两个指针,其中s指针始终记录值较小的结点,并与p所指结点比较,直到将整个链表比较完毕。
EXCHANGE ——交换结点值函数PRINT——打印单链表,显示结点数据值函数4)输入说明:以为单链表由正整数组成,所以以输入0为输入结束标志。
2题1)用带头结点的单链表实现2)共定义了3个函数CREAT——建立单链表REVERSE——将单链表逆置基本思想:有3个指针r,s。
r指向单链表尾部,s指向单链表头部,s为用于交换结点数据值的中间量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二、实验内容
1.18个记录的关键字为22、12、13、8、9、20、33、42、44、38、24、48、60、58、74、49、86、53,编写分块查找的算法进行查找。(文件夹:分块查找)
2.编写一个判别给定的二叉树是否为二叉排序树的算法,设二叉树以二叉链表存储表示,结点的数据域只存放正整数。(文件夹:判断二叉排序树)
3.能够编写一些排序的算法
二、实验内容
1.采用希尔排序方法对顺序表中的证型数据进行排序,设计希尔排序算法并显示每趟排序的结果。(文件夹:希尔排序)
2.编写一个双向起泡的排序算法,即在排序过程中交替改变扫描方向,同时显示各趟排序的结果。(文件夹:双向起泡排序)
实验八查找
一、实验目的
1.熟悉线性表、二叉排序树和散列表的查找
附录:原代码
实验一:第1题(1)
//顺序表逆置的程序代码
#include<stdio.h>
#include<malloc.h>
//顺序表结构类型定义
typedef char datatype;
const int maxsize=1024;
typedef struct
{ datatype data[maxsize];
实验六图
一、实验目的
1.熟悉图的邻接矩阵和邻接表的存储结构
2.熟悉图的邻接矩阵和邻接表的建立算法
3.掌握图的遍历算法
二、实验内容
1.无向图采用邻接矩阵存储,编写深度优先搜索遍历算法,从不同的顶点出发对无向图进行遍历。(文件夹:无向图邻接矩阵)
实验七排序
一、实验目的
1.熟悉各种内部排序算法
2.能够编写程序显示排序过程中各趟排序的结果
int last;
}sequenlist;
void create(sequenlist*&);
void print(sequenlist*);
void invert(sequenlist*);
void main()
{
sequenlist*L;
create(L);//建立顺序表
print(L);//输出顺序表
说明
每个实验题目含有一个main函数和一些函数,与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出,供上机实验参考使用。对于每个题目,只需要根据题目要求设计算法,补充函数定义,然后对程序进行编译、调试。
实验一线性表
一、实验目的
1.熟悉线性表的顺序和链式存储结构
2.掌握线性表的基本运算
2.已知由不具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。(文件夹:分解单链表)
实验二栈和队列
一、实验目的
1.熟悉栈和队列的顺序和链式存储结构
2.掌握栈和队列的基本运算
invert(L);//调用顺序表逆值的函数
print(L);//输出顺序表
}
//建立顺序表
void create(sequenlist*&L)
{
L=(sequenlist*)malloc(sizeof(sequenlist));
L->last=0;
char ch;
while((ch=getchΒιβλιοθήκη r())!='*')
{
L->last++;
2.A和B是两个n×n阶的对称矩阵,以行为主序输入对称矩阵的下三角元素,压缩存储存入一维数组A和B,编写一个算法计算对称矩阵A和B的乘积,结果存入二维数组C。(文件夹:对称矩阵相乘)
实验五树
一、实验目的
1.熟悉二叉树的链式存储结构
2.掌握二叉树的建立、深度优先递归遍历等算法
3.能够利用遍历算法实现一些应用
二、实验内容
1.已知二叉树采用二叉链表存储结构,如果左、右子树非空,且左子树根结点大于右子树根结点,则交换根结点的左、右子树。即按要求交换二叉树及子树的左、右子树。(文件夹:交换左右子树)
2.采用二叉链表结构存储一棵二叉树,编写一个算法统计该二叉树中结点总数及叶子结点总数。(文件夹:统计二叉树结点)
实验三串
一、实验目的
1.熟悉串的顺序存储结构
2.掌握串的基本运算及应用
二、实验内容
1.串采用顺序存储结构,编写朴素模式匹配算法,查找在串中是否存在给定的子串。(文件夹:模式匹配)
2.若S是一个采用顺序结构存储的串,利用C的库函数strlen和strcpy(或strncpy)编写一算法void SteDelete(char*S,intI,int m),要求从S中删除从第i个字符开始的连续m个字符。若i≥strlen(S),则没有字符被删除;若i+m≥strlen(S),则将S中从位置i开始直至末尾的字符均删除。(文件夹:删除子串)
3.能够利用栈和队列的基本运算完成栈和队列应用的运算
二、实验内容
1.设单链表中存放有n个字符,试编写算法,判断该字符串是否有中心对称的关系,例如xyzzyx是中心对称的字符串。(提示:将单链表中的一半字符先依次进栈,然后依次出栈与单链表中的另一半字符进行比较。)(文件夹:判字符串中心对称)
2.假设以数组sequ[m]存放循环队列的元素,同时设变量rear和quelen分别指示循环队列中队尾元素的位置和内含元素的个数。编写实现该循环队列的入队和出队操作的算法。提示:队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。(文件夹:循环队列)
实验四数组
一、实验目的
1.熟悉数组的结构
2.掌握矩阵的压缩存储
3.能够对数组和矩阵的压缩存储进行运算
二、实验内容
1.若在矩阵Am×n中存在一个元素A[i][j],其满足A[i][j]是第i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一个马鞍点。用二维数组存储矩阵Am×n,设计算法求出矩阵中所有马鞍点。(文件夹:找马鞍点)
3.能够利用线性表的基本运算完成线性表应用的运算
二、实验内容
1.设有一个线性表E={e1, e2,…, en-1, en},设计一个算法,将线性表逆置,即使元素排列次序颠倒过来,成为逆线性表E’={ en, en-1,…, e2, e1},要求逆线性表占用原线性表空间,并且用顺序表和单链表两种方法表示,分别用两个程序来完成。(文件夹:顺序表逆置、单链表逆置)