数据结构实验题
数据结构实验五(二叉树的建立及遍历)题目和源程序

实验5:二叉树的建立及遍历(第十三周星期三7、8节)一、实验目的1.学会实现二叉树结点结构和对二叉树的基本操作。
2.掌握对二叉树每种操作的具体实现,学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
二、实验要求1.认真阅读和掌握和本实验相关的教材内容。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容1.编写程序任意输入二叉树的结点个数和结点值,构造一棵二叉树,采用三种递归遍历算法(前序、中序、后序)对这棵二叉树进行遍历并计算出二叉树的高度。
2 .编写程序生成下面所示的二叉树,并采用中序遍历的非递归算法对此二叉树进行遍历。
四、思考与提高1.如何计算二叉链表存储的二叉树中度数为1的结点数?2.已知有—棵以二叉链表存储的二叉树,root指向根结点,p指向二叉树中任一结点,如何求从根结点到p所指结点之间的路径?/*----------------------------------------* 05-1_递归遍历二叉树.cpp -- 递归遍历二叉树的相关操作* 对递归遍历二叉树的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds05.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>typedef char ElemType;using namespace std;typedef struct BiTNode {ElemType data;//左右孩子指针BiTNode *lchild, *rchild;}BiTNode, *BiTree;//动态输入字符按先序创建二叉树void CreateBiTree(BiTree &T) {char ch;ch = cin.get();if(ch == ' ') {T = NULL;}else {if(ch == '\n') {cout << "输入未结束前不要输入回车,""要结束分支请输入空格!" << endl;}else {//生成根结点T = (BiTNode * )malloc(sizeof(BiTNode));if(!T)cout << "内存分配失败!" << endl;T->data = ch;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);}}}//输出e的值ElemType PrintElement(ElemType e) { cout << e << " ";return e;}//先序遍历void PreOrderTraverse(BiTree T) { if (T != NULL) {//打印结点的值PrintElement(T->data);//遍历左孩子PreOrderTraverse(T->lchild);//遍历右孩子PreOrderTraverse(T->rchild);}}//中序遍历void InOrderTraverse(BiTree T) {if (T != NULL) {//遍历左孩子InOrderTraverse(T->lchild);//打印结点的值PrintElement(T->data);//遍历右孩子InOrderTraverse(T->rchild);}}//后序遍历void PostOrderTraverse(BiTree T) { if (T != NULL) {//遍历左孩子PostOrderTraverse(T->lchild);//遍历右孩子PostOrderTraverse(T->rchild);//打印结点的值PrintElement(T->data);}}//按任一种遍历次序输出二叉树中的所有结点void TraverseBiTree(BiTree T, int mark) {if(mark == 1) {//先序遍历PreOrderTraverse(T);cout << endl;}else if(mark == 2) {//中序遍历InOrderTraverse(T);cout << endl;}else if(mark == 3) {//后序遍历PostOrderTraverse(T);cout << endl;}else cout << "选择遍历结束!" << endl;}//输入值并执行选择遍历函数void ChoiceMark(BiTree T) {int mark = 1;cout << "请输入,先序遍历为1,中序为2,后序为3,跳过此操作为0:";cin >> mark;if(mark > 0 && mark < 4) {TraverseBiTree(T, mark);ChoiceMark(T);}else cout << "此操作已跳过!" << endl;}//求二叉树的深度int BiTreeDepth(BiTNode *T) {if (T == NULL) {//对于空树,返回0并结束递归return 0;}else {//计算左子树的深度int dep1 = BiTreeDepth(T->lchild);//计算右子树的深度int dep2 = BiTreeDepth(T->rchild);//返回树的深度if(dep1 > dep2)return dep1 + 1;elsereturn dep2 + 1;}}int _tmain(int argc, _TCHAR* argv[]){BiTNode *bt;bt = NULL; //将树根指针置空cout << "输入规则:" << endl<< "要生成新结点,输入一个字符,""不要生成新结点的左孩子,输入一个空格,""左右孩子都不要,输入两个空格,""要结束,输入多个空格(越多越好),再回车!"<< endl << "按先序输入:";CreateBiTree(bt);cout << "树的深度为:" << BiTreeDepth(bt) << endl;ChoiceMark(bt);return 0;}/*----------------------------------------* 05-2_构造二叉树.cpp -- 构造二叉树的相关操作* 对构造二叉树的每个基本操作都用单独的函数来实现* 水上飘2009年写----------------------------------------*/// ds05-2.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#define STACK_INIT_SIZE 100 //栈的存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量typedef char ElemType; //元素类型using namespace std;typedef struct BiTNode {ElemType data; //结点值BiTNode *lchild, *rchild; //左右孩子指针}BiTNode, *BiTree;typedef struct {BiTree *base; //在栈构造之前和销毁之后,base的值为空BiTree *top; //栈顶指针int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//构造一个空栈void InitStack(SqStack &s) {s.base = (BiTree *)malloc(STACK_INIT_SIZE * sizeof(BiTree));if(!s.base)cout << "存储分配失败!" << endl;s.top = s.base;s.stacksize = STACK_INIT_SIZE;}//插入元素e为新的栈顶元素void Push(SqStack &s, BiTree e) {//栈满,追加存储空间if ((s.top - s.base) >= s.stacksize) {s.base = (BiTree *)malloc((STACK_INIT_SIZE+STACKINCREMENT) * sizeof(BiTree));if(!s.base)cout << "存储分配失败!" << endl;s.top = s.base + s.stacksize;s.stacksize += STACK_INIT_SIZE;}*s.top++ = e;}//若栈不空,则删除s的栈顶元素,并返回其值BiTree Pop(SqStack &s) {if(s.top == s.base)cout << "栈为空,无法删除栈顶元素!" << endl;s.top--;return *s.top;}//按先序输入字符创建二叉树void CreateBiTree(BiTree &T) {char ch;//接受输入的字符ch = cin.get();if(ch == ' ') {//分支结束T = NULL;} //if' 'endelse if(ch == '\n') {cout << "输入未结束前不要输入回车,""要结束分支请输入空格!(接着输入)" << endl;} //if'\n'endelse {//生成根结点T = (BiTNode * )malloc(sizeof(BiTree));if(!T)cout << "内存分配失败!" << endl;T->data = ch;//构造左子树CreateBiTree(T->lchild);//构造右子树CreateBiTree(T->rchild);} //Create end}//输出e的值,并返回ElemType PrintElement(ElemType e) {cout << e << " ";return e;}//中序遍历二叉树的非递归函数void InOrderTraverse(BiTree p, SqStack &S) {cout << "中序遍历结果:";while(S.top != S.base || p != NULL) {if(p != NULL) {Push(S,p);p = p->lchild;} //if NULL endelse {BiTree bi = Pop(S);if(!PrintElement(bi->data))cout << "输出其值未成功!" << endl;p = bi->rchild;} //else end} //while endcout << endl;}int _tmain(int argc, _TCHAR* argv[]){BiTNode *bt;SqStack S;InitStack(S);bt = NULL; //将树根指针置空cout << "老师要求的二叉树序列(‘空’表示空格):""12空空346空空空5空空,再回车!"<< endl << "请按先序输入一个二叉树序列(可另输入,但要为先序),""无左右孩子则分别输入空格。
国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案

x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");
数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)

数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)数据结构基础及深入及考试习题及实验参考答案见附录结论1、数据的逻辑结构是指数据元素之间的逻辑关系。
即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。
它依赖于计算机。
存储结构可分为4大类:顺序、链式、索引、散列3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。
它由基本的数据类型构成,并包括一组相关的服务(或称操作)。
它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。
4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
5、在数据结构中,从逻辑上可以把数据结构分成(C)A、动态结构和表态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构6、算法的时间复杂度取决于(A)A、问题的规模B、待处理数据的初态C、问题的规模和待处理数据的初态线性表1、线性表的存储结构包括顺序存储结构和链式存储结构两种。
2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为(E),删除一个元素需要移动的元素的个数为(A)。
A、(n-1)/2B、nC、n+1D、n-1E、n/2F、(n+1)/2G、(n-2)/23、“线性表的逻辑顺序与存储顺序总是一致的。
”这个结论是(B)A、正确的B、错误的C、不一定,与具体的结构有关4、线性表采用链式存储结构时,要求内存中可用存储单元的地址(D)A、必须是连续的B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以5、带头结点的单链表为空的判定条件是(B)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL6、不带头结点的单链表head为空的判定条件是(A)A、head==NULLB、head->ne某t==NULLC、head->ne某t=headD、head!=NULL7、非空的循环单链表head的尾结点P满足(C)A、p->ne某t==NULLB、p==NULLC、p->ne某t==headD、p==head8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是(B)A、O(1)B、O(n)C、O(n2)D、O(nlog2n)数据结构(第4版)习题及实验参考答案9、在一个单链表中,若删除p所指结点的后继结点,则执行(A)A、p->ne某t=p->ne某t->ne某t;B、p=p->ne某t;p->ne某t=p->ne某t->ne某t;C、p->ne某t=p->ne某t;D、p=p->ne某t->ne某t;10、在一个单链表中,若在p所指结点之后插入所指结点,则执行(B)A、->ne某t=p;p->ne某t=;B、->ne某t=p->ne某t;p->ne某t=;C、->ne某t=p->ne某t;p=;D、p->ne某t=;->ne某t=p;11、在一个单链表中,已知q是p的前趋结点,若在q和p之间插入结点,则执行(C)A、->ne某t=p->ne某t;p->ne某t=;B、p->ne某t=->ne某t;->ne某t=p;C、q->ne某t=;->ne某t=p;D、p->ne某t=;->ne某t=q;12、在线性结构中,第一个结点没有前趋结点,其余每个结点有且只有1个前趋结点。
数据结构上机实验

目录第1章绪论——上机实验题1解析实验题1.1求素数实验题1.2求一个正整数的各位数字之和实验题1.3求一个字符串是否为回文第2章线性表——上机实验题2解析实验题2.1实现顺序表各种基本运算的算法/*文件名:algo2-1.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef char ElemType;typedef struct{ElemType elem[MaxSize];int length;} SqList;void InitList(SqList *&L){L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList *L){free(L);}int ListEmpty(SqList *L){return(L->length==0);}int ListLength(SqList *L){return(L->length);}void DispList(SqList *L){int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c",L->elem[i]);printf("\n");}int GetElem(SqList *L,int i,ElemType &e){if (i<1 || i>L->length)return 0;e=L->elem[i-1];return 1;}int LocateElem(SqList *L, ElemType e){int i=0;while (i<L->length && L->elem[i]!=e) i++;if (i>=L->length)return 0;elsereturn i+1;}int ListInsert(SqList *&L,int i,ElemType e){int j;if (i<1 || i>L->length+1)return 0;i--; /*将顺序表位序转化为elem下标*/for (j=L->length;j>i;j--) /*将elem[i]及后面元素后移一个位置*/L->elem[j]=L->elem[j-1];L->elem[i]=e;L->length++; /*顺序表长度增1*/return 1;}int ListDelete(SqList *&L,int i,ElemType &e){int j;if (i<1 || i>L->length)return 0;i--; /*将顺序表位序转化为elem下标*/e=L->elem[i];for (j=i;j<L->length-1;j++)L->elem[j]=L->elem[j+1];L->length--;return 1;}实验题2.2实现单链表各种基本运算的算法*文件名:algo2-2.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct LNode /*定义单链表结点类型*/{ElemType data;struct LNode *next;} LinkList;void InitList(LinkList *&L){L=(LinkList *)malloc(sizeof(LinkList)); /*创建头结点*/L->next=NULL;}void DestroyList(LinkList *&L){LinkList *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);}int ListEmpty(LinkList *L){return(L->next==NULL);}int ListLength(LinkList *L){LinkList *p=L;int i=0;while (p->next!=NULL){i++;p=p->next;}return(i);}void DispList(LinkList *L){LinkList *p=L->next;while (p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}int GetElem(LinkList *L,int i,ElemType &e) {int j=0;LinkList *p=L;while (j<i && p!=NULL){j++;p=p->next;}if (p==NULL)return 0;else{e=p->data;return 1;}}int LocateElem(LinkList *L,ElemType e){LinkList *p=L->next;int n=1;while (p!=NULL && p->data!=e){p=p->next;n++;}if (p==NULL)return(0);elsereturn(n);}int ListInsert(LinkList *&L,int i,ElemType e)int j=0;LinkList *p=L,*s;while (j<i-1 && p!=NULL){j++;p=p->next;}if (p==NULL) /*未找到第i-1个结点*/return 0;else /*找到第i-1个结点*p*/{s=(LinkList *)malloc(sizeof(LinkList)); /*创建新结点*s*/s->data=e;s->next=p->next; /*将*s插p->next=s;return 1;}}int ListDelete(LinkList *&L,int i,ElemType &e){int j=0;LinkList *p=L,*q;while (j<i-1 && p!=NULL){j++;p=p->next;}if (p==NULL) /*未找到第i-1个结点*/return 0;else /*找到第i-1个结点*p*/{q=p->next; /*q指向要删除的结点*/p->next=q->next; /*从单链表中删除*q结点*/free(q); /*释放*q结点*/return 1;}}第3章栈和队列——上机实验题3解析实验题3.1实现顺序栈各种基本运算的算法*文件名:algo3-1.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType elem[MaxSize];int top; /*栈指针*/} SqStack;void InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}void ClearStack(SqStack *&s){free(s);}int StackLength(SqStack *s){return(s->top+1);}int StackEmpty(SqStack *s){return(s->top==-1);}int Push(SqStack *&s,ElemType e){if (s->top==MaxSize-1)return 0;s->top++;s->elem[s->top]=e;return 1;}int Pop(SqStack *&s,ElemType &e){if (s->top==-1)return 0;e=s->elem[s->top];s->top--;return 1;int GetTop(SqStack *s,ElemType &e){if (s->top==-1)return 0;e=s->elem[s->top];return 1;}void DispStack(SqStack *s){int i;for (i=s->top;i>=0;i--)printf("%c ",s->elem[i]);printf("\n");}实验题3.2实现链栈各种基本运算的算法/*文件名:algo3-2.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct linknode{ElemType data; /*数据域*/struct linknode *next; /*指针域*/} LiStack;void InitStack(LiStack *&s){s=(LiStack *)malloc(sizeof(LiStack));s->next=NULL;}void ClearStack(LiStack *&s){LiStack *p=s->next;while (p!=NULL){free(s);s=p;p=p->next;}}int StackLength(LiStack *s){int i=0;LiStack *p;p=s->next;while (p!=NULL){i++;p=p->next;}return(i);}int StackEmpty(LiStack *s){return(s->next==NULL);}void Push(LiStack *&s,ElemType e){LiStack *p;p=(LiStack *)malloc(sizeof(LiStack));p->data=e;p->next=s->next; /*插入*p结点作为第一个数据结点*/s->next=p;}int Pop(LiStack *&s,ElemType &e){LiStack *p;if (s->next==NULL) /*栈空的情况*/return 0;p=s->next; /*p指向第一个数据结点*/e=p->data;s->next=p->next;free(p);return 1;}int GetTop(LiStack *s,ElemType &e){if (s->next==NULL) /*栈空的情况*/return 0;e=s->next->data;return 1;}void DispStack(LiStack *s){LiStack *p=s->next;while (p!=NULL){printf("%c ",p->data);p=p->next;}printf("\n");}实验题3.3实现顺序队列各种基本运算的算法/*文件名:algo3-3.cpp*/#include <stdio.h>#include <malloc.h>#define MaxSize 5typedef char ElemType;typedef struct{ElemType elem[MaxSize];int front,rear; /*队首和队尾指针*/} SqQueue;void InitQueue(SqQueue *&q){q=(SqQueue *)malloc (sizeof(SqQueue));q->front=q->rear=0;}void ClearQueue(SqQueue *&q){free(q);}int QueueEmpty(SqQueue *q){return(q->front==q->rear);}int QueueLength(SqQueue *q){return (q->rear-q->front+MaxSize)%MaxSize; }int enQueue(SqQueue *&q,ElemType e){if ((q->rear+1)%MaxSize==q->front) /*队满*/return 0;q->rear=(q->rear+1)%MaxSize;q->elem[q->rear]=e;return 1;}int deQueue(SqQueue *&q,ElemType &e){if (q->front==q->rear) /*队空*/return 0;q->front=(q->front+1)%MaxSize;e=q->elem[q->front];return 1;}实验题3.4实现链队各种基本运算的算法/*文件名:algo3-4.cpp*/#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct qnode{ElemType data;struct qnode *next;} QNode;typedef struct{QNode *front;QNode *rear;} LiQueue;void InitQueue(LiQueue *&q){q=(LiQueue *)malloc(sizeof(LiQueue));q->front=q->rear=NULL;}void ClearQueue(LiQueue *&q){QNode *p=q->front,*r;if (p!=NULL) /*释放数据结点占用空间*/{r=p->next;while (r!=NULL){free(p);p=r;r=p->next;}}free(q); /*释放头结点占用空间*/ }int QueueLength(LiQueue *q){int n=0;QNode *p=q->front;while (p!=NULL){n++;p=p->next;}return(n);}int QueueEmpty(LiQueue *q){if (q->rear==NULL)return 1;elsereturn 0;}void enQueue(LiQueue *&q,ElemType e){QNode *s;s=(QNode *)malloc(sizeof(QNode));s->data=e;s->next=NULL;if (q->rear==NULL) /*若链队为空,则新结点是队首结点又是队尾结点*/q->front=q->rear=s;else{q->rear->next=s; /*将*s结点链到队尾,rear指向它*/q->rear=s;}}int deQueue(LiQueue *&q,ElemType &e){QNode *t;if (q->rear==NULL) /*队列为空*/return 0;if (q->front==q->rear) /*队列中只有一个结点时*/{t=q->front;q->front=q->rear=NULL;}else /*队列中有多个结点时*/{t=q->front;q->front=q->front->next;}e=t->data;free(t);return 1;}第4章串——上机实验题4解析实验题4.1实现顺序串各种基本运算的算法/*文件名:algo4-1.cpp*/#include <stdio.h>#define MaxSize 100 /*最多的字符个数*/typedef struct{ char ch[MaxSize]; /*定义可容纳MaxSize个字符的空间*/ int len; /*标记当前实际串长*/} SqString;void StrAssign(SqString &str,char cstr[]) /*str为引用型参数*/ {int i;for (i=0;cstr[i]!='\0';i++)str.ch[i]=cstr[i];str.len=i;}void StrCopy(SqString &s,SqString t) /*s为引用型参数*/ {int i;for (i=0;i<t.len;i++)s.ch[i]=t.ch[i];s.len=t.len;}int StrEqual(SqString s,SqString t){int same=1,i;if (s.len!=t.len) /*长度不相等时返回0*/same=0;else{for (i=0;i<s.len;i++)if (s.ch[i]!=t.ch[i]) /*有一个对应字符不相同时返回0*/same=0;}return same;}int StrLength(SqString s){return s.len;}SqString Concat(SqString s,SqString t){SqString str;int i;str.len=s.len+t.len;for (i=0;i<s.len;i++) /*将s.ch[0]~s.ch[s.len-1]复制到str*/ str.ch[i]=s.ch[i];for (i=0;i<t.len;i++) /*将t.ch[0]~t.ch[t.len-1]复制到str*/ str.ch[s.len+i]=t.ch[i];return str;}SqString SubStr(SqString s,int i,int j){SqString str;int k;str.len=0;if (i<=0 || i>s.len || j<0 || i+j-1>s.len){printf("参数不正确\n");return str; /*参数不正确时返回空串*/}for (k=i-1;k<i+j-1;k++) /*将s.ch[i]~s.ch[i+j]复制到str*/str.ch[k-i+1]=s.ch[k];str.len=j;return str;}SqString InsStr(SqString s1,int i,SqString s2){int j;SqString str;str.len=0;if (i<=0 || i>s1.len+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return s1;}for (j=0;j<i-1;j++) /*将s1.ch[0]~s1.ch[i-2]复制到str*/str.ch[j]=s1.ch[j];for (j=0;j<s2.len;j++) /*将s2.ch[0]~s2.ch[s2.len-1]复制到str*/str.ch[i+j-1]=s2.ch[j];for (j=i-1;j<s1.len;j++) /*将s1.ch[i-1]~s.ch[s1.len-1]复制到str*/str.ch[s2.len+j]=s1.ch[j];str.len=s1.len+s2.len;return str;}SqString DelStr(SqString s,int i,int j){int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j>s.len+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return str;}for (k=0;k<i-1;k++) /*将s.ch[0]~s.ch[i-2]复制到str*/str.ch[k]=s.ch[k];for (k=i+j-1;k<s.len;k++)/*将s.ch[i+j-1]~ch[s.len-1]复制到str*/ str.ch[k-j]=s.ch[k];str.len=s.len-j;return str;}SqString RepStr(SqString s,int i,int j,SqString t){int k;SqString str;str.len=0;if (i<=0 || i>s.len || i+j-1>s.len) /*参数不正确时返回空串*/ {printf("参数不正确\n");return str;}for (k=0;k<i-1;k++) /*将s.ch[0]~s.ch[i-2]复制到str*/str.ch[k]=s.ch[k];for (k=0;k<t.len;k++) /*将t.ch[0]~t.ch[t.len-1]复制到str*/str.ch[i+k-1]=t.ch[k];for (k=i+j-1;k<s.len;k++) /*将s.ch[i+j-1]~ch[s.len-1]复制到str*/str.ch[t.len+k-j]=s.ch[k];str.len=s.len-j+t.len;return str;}void DispStr(SqString str){int i;if (str.len>0){for (i=0;i<str.len;i++)printf("%c",str.ch[i]);printf("\n");}}实验题4.2实现链串各种基本运算的算法*文件名:algo4-2.cpp*/#include <stdio.h>#include <malloc.h>typedef struct snode{char data;struct snode *next;} LiString;void StrAssign(LiString *&s,char t[]){int i;LiString *r,*p;s=(LiString *)malloc(sizeof(LiString));s->next=NULL;r=s;for (i=0;t[i]!='\0';i++){p=(LiString *)malloc(sizeof(LiString));p->data=t[i];p->next=NULL;r->next=p;r=p;}}void StrCopy(LiString *&s,LiString *t){LiString *p=t->next,*q,*r;s=(LiString *)malloc(sizeof(LiString));s->next=NULL;s->next=NULL;r=s;while (p!=NULL) /*将t的所有结点复制到s*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}}int StrEqual(LiString *s,LiString *t){LiString *p=s->next,*q=t->next;while (p!=NULL && q!=NULL && p->data==q->data){p=p->next;q=q->next;}if (p==NULL && q==NULL)return 1;elsereturn 0;}int StrLength(LiString *s){int i=0;LiString *p=s->next;while (p!=NULL){i++;p=p->next;}return i;}LiString *Concat(LiString *s,LiString *t){LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;while (p!=NULL) /*将s的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}p=t->next;while (p!=NULL) /*将t的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *SubStr(LiString *s,int i,int j){int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++)p=p->next;for (k=1;k<=j;k++) /*将s的第i个结点开始的j个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *InsStr(LiString *s,int i,LiString *t){int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s)+1) /*参数不正确时返回空串*/{printf("参数不正确\n");return str;}for (k=1;k<i;k++) /*将s的前i个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}while (p1!=NULL) /*将t的所有结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;q->next=NULL;r->next=q;r=q;p1=p1->next;}while (p!=NULL) /*将*p及其后的结点复制到str*/ {q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *DelStr(LiString *s,int i,int j){int k;LiString *str,*p=s->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++) /*让p沿next跳j个结点*/p=p->next;while (p!=NULL) /*将*p及其后的结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}LiString *RepStr(LiString *s,int i,int j,LiString *t){int k;LiString *str,*p=s->next,*p1=t->next,*q,*r;str=(LiString *)malloc(sizeof(LiString));str->next=NULL;r=str;if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s)) {printf("参数不正确\n");return str; /*参数不正确时返回空串*/ }for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}for (k=0;k<j;k++) /*让p沿next跳j个结点*/p=p->next;while (p1!=NULL) /*将t的所有结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p1->data;q->next=NULL;r->next=q;r=q;p1=p1->next;}while (p!=NULL) /*将*p及其后的结点复制到str*/{q=(LiString *)malloc(sizeof(LiString));q->data=p->data;q->next=NULL;r->next=q;r=q;p=p->next;}return str;}void DispStr(LiString *s){LiString *p=s->next;while (p!=NULL){printf("%c",p->data);p=p->next;}printf("\n");}第5章数组和稀疏矩阵——上机实验题5解析实验题5.1求5×5阶螺旋方阵/*文件名:exp5-1.cpp*/#include <stdio.h>#define MaxLen 10void fun(int a[MaxLen][MaxLen],int n){int i,j,k=0,m;if (n%2==0) //m=én/2ùm=n/2;elsem=n/2+1;for (i=0;i<m;i++){for (j=i;j<n-i;j++){k++;a[i][j]=k;}for (j=i+1;j<n-i;j++){k++;a[j][n-i-1]=k;}for (j=n-i-2;j>=i;j--){k++;a[n-i-1][j]=k;}for (j=n-i-2;j>=i+1;j--){k++;a[j][i]=k;}}}void main(){int n,i,j;int a[MaxLen][MaxLen];printf("\n");printf("输入n(n<10):");scanf("%d",&n);fun(a,n);printf("%d阶数字方阵如下:\n",n);for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",a[i][j]);printf("\n");}printf("\n");}实验题5.2求一个矩阵的马鞍点/*文件名:exp5-2.cpp*/#include <stdio.h>#define M 4#define N 4void MinMax(int A[M][N]){int i,j,have=0;int min[M],max[N];for (i=0;i<M;i++) /*计算出每行的最小值元素,放入min[0..M-1]之中*/{min[i]=A[i][0];for (j=1;j<N;j++)if (A[i][j]<min[i])min[i]=A[i][j];}for (j=0;j<N;j++) /*计算出每列的最大值元素,放入max[0..N-1]之中*/{max[j]=A[0][j];for (i=1;i<M;i++)if (A[i][j]>max[j])max[j]=A[i][j];}for (i=0;i<M;i++)for (j=0;j<N;j++)if (min[i]==max[j]){printf(" A[%d,%d]=%d\n",i,j,A[i][j]); /*显示马鞍点*/have=1;}if (!have)printf("没有鞍点\n");}void main(){int i,j;int A[M][N]={{9, 7, 6, 8},{20,26,22,25},{28,36,25,30},{12,4, 2, 6}};printf("A矩阵:\n");for (i=0;i<M;i++){for (j=0;j<N;j++)printf("%4d",A[i][j]);printf("\n");}printf("A矩阵中的马鞍点:\n");MinMax(A); /*调用MinMax()找马鞍点*/}实验题5.3求两个对称矩阵之和与乘积/*文件名:exp5-3.cpp*/#include <stdio.h>#define n 4#define m 10int value(int a[],int i,int j){if (i>=j)return a[(i*(i-1))/2+j];elsereturn a[(j*(j-1))/2+i];}void madd(int a[],int b[],int c[n][n]){int i,j;for (i=0;i<n;i++)for (j=0;j<n;j++)c[i][j]=value(a,i,j)+value(b,i,j);}void mult(int a[],int b[],int c[n][n]){int i,j,k,s;for (i=0;i<n;i++)for (j=0;j<n;j++){s=0;for (k=0;k<n;k++)s=s+value(a,i,k)*value(b,k,j); c[i][j]=s;}}void disp1(int a[]){int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",value(a,i,j));printf("\n");}}void disp2(int c[n][n]){int i,j;for (i=0;i<n;i++){for (j=0;j<n;j++)printf("%4d",c[i][j]);printf("\n");}}void main(){int a[m]={1,2,3,4,5,6,7,8,9,10};int b[m]={1,1,1,1,1,1,1,1,1,1};int c1[n][n],c2[n][n];madd(a,b,c1);mult(a,b,c2);printf("\n");printf("a矩阵:\n");disp1(a);printf("b矩阵:\n");disp1(b);printf("a+b:\n");disp2(c1);printf("a*b:\n");disp2(c2);printf("\n");}实验题5.4实现稀疏矩阵(采用三元组表示)的基本运算/*文件名:exp5-4.cpp*/#include <stdio.h>#define N 4typedef int ElemType;#define MaxSize 100 /*矩阵中非零元素最多个数*/ typedef struct{ int r; /*行号*/int c; /*列号*/ElemType d; /*元素值*/} TupNode; /*三元组定义*/typedef struct{ int rows; /*行数值*/int cols; /*列数值*/int nums; /*非零元素个数*/TupNode data[MaxSize];} TSMatrix; /*三元组顺序表定义*/void CreatMat(TSMatrix &t,ElemType A[N][N]){int i,j;t.rows=N;t.cols=N;t.nums=0;for (i=0;i<N;i++){for (j=0;j<N;j++)if (A[i][j]!=0){t.data[t.nums].r=i;t.data[t.nums].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}}void DispMat(TSMatrix t){int i;if (t.nums<=0)return;printf("\t%d\t%d\t%d\n",t.rows,t.cols,t.nums);printf("\t------------------\n");for (i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n",t.data[i].r,t.data[i].c,t.data[i].d); }void TranMat(TSMatrix t,TSMatrix &tb){int p,q=0,v; /*q为tb.data的下标*/tb.rows=t.cols;tb.cols=t.rows;tb.nums=t.nums;if (t.nums!=0){for (v=0;v<t.cols;v++) /*tb.data[q]中的记录以c 域的次序排列*/for (p=0;p<t.nums;p++) /*p为t.data的下标*/if (t.data[p].c==v){tb.data[q].r=t.data[p].c;tb.data[q].c=t.data[p].r;tb.data[q].d=t.data[p].d;q++;}}}int MatAdd(TSMatrix a,TSMatrix b,TSMatrix &c){int i=0,j=0,k=0;ElemType v;if (a.rows!=b.rows || a.cols!=b.cols)return 0; /*行数或列数不等时不能进行相加运算*/c.rows=a.rows;c.cols=a.cols; /*c的行列数与a的相同*/while (i<a.nums && j<b.nums) /*处理a和b中的每个元素*/{if (a.data[i].r==b.data[j].r) /*行号相等时*/{if(a.data[i].c<b.data[j].c) /*a元素的列号小于b 元素的列号*/{c.data[k].r=a.data[i].r;/*将a元素添加到c中*/c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}else if (a.data[i].c>b.data[j].c)/*a元素的列号大于b元素的列号*/{c.data[k].r=b.data[j].r; /*将b元素添加到c中*/c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}else /*a元素的列号等于b元素的列号*/{v=a.data[i].d+b.data[j].d;if (v!=0) /*只将不为0的结果添加到c中*/{c.data[k].r=a.data[i].r;c.data[k].c=a.data[i].c;c.data[k].d=v;k++;}i++;j++;}}else if (a.data[i].r<b.data[j].r) /*a元素的行号小于b元素的行号*/{c.data[k].r=a.data[i].r; /*将a元素添加到c中*/c.data[k].c=a.data[i].c;c.data[k].d=a.data[i].d;k++;i++;}else /*a元素的行号大于b元素的行号*/{c.data[k].r=b.data[j].r; /*将b元素添加到c中*/c.data[k].c=b.data[j].c;c.data[k].d=b.data[j].d;k++;j++;}c.nums=k;}return 1;}int value(TSMatrix c,int i,int j){int k=0;while (k<c.nums && (c.data[k].r!=i || c.data[k].c!=j))k++;if (k<c.nums)return(c.data[k].d);elsereturn(0);}int MatMul(TSMatrix a,TSMatrix b,TSMatrix &c){int i,j,k,p=0;ElemType s;if (a.cols!=b.rows) /*a的列数不等于b的行数时不能进行相乘运算*/return 0;for (i=0;i<a.rows;i++)for (j=0;j<b.cols;j++){s=0;for (k=0;k<a.cols;k++)s=s+value(a,i,k)*value(b,k,j);if (s!=0) /*产生一个三元组元素*/{c.data[p].r=i;c.data[p].c=j;c.data[p].d=s;p++;}}c.rows=a.rows;c.cols=b.cols;c.nums=p;return 1;}void main(){ElemType a1[N][N]={{1,0,3,0},{0,1,0,0},{0,0,1,0},{0,0,1,1}};ElemType b1[N][N]={{3,0,0,0},{0,4,0,0},{0,0,1,0},{0,0,0,2}};TSMatrix a,b,c;CreatMat(a,a1);CreatMat(b,b1);printf("a的三元组:\n");DispMat(a);printf("b的三元组:\n");DispMat(b);printf("a转置为c\n");TranMat(a,c);printf("c的三元组:\n");DispMat(c);printf("c=a+b\n");MatAdd(a,b,c);printf("c的三元组:\n");DispMat(c);printf("c=a*b\n");MatMul(a,b,c);printf("c的三元组:\n");DispMat(c);}实验题5.5实现广义表的基本运算#include <stdio.h>#include <malloc.h>typedef char ElemType;typedef struct lnode{ int tag; /*结点类型标识*/ union{ElemType data;struct lnode *sublist;}val;struct lnode *link; /*指向下一个元素*/} GLNode;extern GLNode *CreatGL(char *&s);extern void DispGL(GLNode *g);void Change(GLNode *&g,ElemType s,ElemType t) /*将广义表g中所有原子s 替换成t*/{if (g!=NULL){if (g->tag==1) /*子表的情况*/Change(g->val.sublist,s,t);else if (g->val.data==s) /*原子且data域值为s的情况*/g->val.data=t;Change(g->link,s,t);}}void Reverse(GLNode *&g) /*将广义表g所有元素逆置*/{GLNode *p,*q,*t;t=NULL;if (g!=NULL){p=g;while (p!=NULL) /*将同级的兄弟逆置*/{q=p->link;if (t==NULL){t=p;p->link=NULL;}else{p->link=t;t=p;}p=q;}g=t;p=g;while (p!=NULL){if (p->tag==1)Reverse(p->val.sublist);p=p->link;}}}int Same(GLNode *g1,GLNode *g2) /*判断两个广义表是否相同*/ {int s;if (g1==NULL && g2==NULL) /*均为NULL的情况*/return 1;else if ((g1==NULL && g2!=NULL) || (g1!=NULL && g2==NULL)) /*一个为NULL,另一不为NULL的情况*/return 0;else{s=1;while (g1!=NULL && g2!=NULL && s==1){if (g1->tag==1 && g2->tag==1)/*均为子表的情况*/s=Same(g1->val.sublist,g2->val.sublist);else if (g1->tag==0 && g2->tag==0)/*均为原子的情况*/{if (g1->val.data!=g2->val.data)s=0;}else /*一个为原子,另一为子表的情况*/s=0;g1=g1->link;g2=g2->link;}if (g1!=NULL || g2!=NULL) /*有一个子表尚未比较完时*/s=0;return s;}}ElemType MaxAtom(GLNode *g) /*求广义表g中最大的原子*/{ElemType m=0,m1; /*m赋初值0*/while (g!=NULL){if (g->tag==1) /*子表的情况*/{m1=MaxAtom(g->val.sublist); /*对子表递归调用*/if (m1>m) m=m1;}else{if (g->val.data>m) /*为原子时,进行原子比较*/m=g->val.data;}g=g->link;}return m;}void DelAtom(GLNode *&g,ElemType x) /*删除广义表g中的第一个为x原子*/{GLNode *p=g,*q,*pre;while (p!=NULL){q=p->link;if (p->tag==1) /*子表的情况*/DelAtom(p->val.sublist,x); /*对子表递归调用*/else{if (p->val.data==x) /*为原子时,进行原子比较*/{if (p==g)/*被删结点是本层的第1个结点*/{g=q;free(p); /*释放结pre=g;}else /*被删结{pre->link=q;free(p);}return;}}pre=p;p=q;}}void DelAtomAll(GLNode *&g,ElemType x) /*删除广义表g中的所有为x原子*/{GLNode *p=g,*q,*pre;while (p!=NULL){q=p->link;if (p->tag==1) /*子表的情况*/DelAtomAll(p->val.sublist,x); /*对子表递归调用*/else{if (p->val.data==x) /*为原子时,进行原子比较*/if (p==g)/*被删结点是本层的第1个结点*/{g=q;free(p); /*释放结pre=g;}else /*被删结{pre->link=q;free(p);}}pre=p;p=q;}}void PreOrder(GLNode *g) /*采用先根遍历g*/{if (g!=NULL){if (g->tag==0) /*为原子结点时*/printf("%c ",g->val.data);elsePreOrder(g->val.sublist); /*为子表时*/ PreOrder(g->link);}}void main(){GLNode *g1,*g2,*g3,*g4;char *str1="(a,(a),((a,b)),((a)),a)";char *str2="(a,(b),((c,d)),((e)),f)";char *str3="(a,(a,b),(a,b,c)))";char *str4="(a,(b),((c,d)),((e)),f)";g1=CreatGL(str1);printf("\n");printf(" 广义表g1:");DispGL(g1);printf("\n");printf(" 将广义表g1中所有'a'改为'b'\n");Change(g1,'a','b');printf(" 广义表g1:");DispGL(g1);printf("\n\n");g2=CreatGL(str2);printf(" 广义表g2:");DispGL(g2);printf("\n");printf(" 广义表g2中最大原子:%c\n",MaxAtom(g2));printf(" 将g2的元素逆置\n");Reverse(g2);printf(" 广义表g2:");DispGL(g2);printf("\n\n");printf(" 广义表g1和g2%s\n\n",(Same(g1,g2)?"相同":"不相同"));g3=CreatGL(str3);printf(" 广义表g3:");DispGL(g3);printf("\n");printf(" 删除广义表g3的第一个为'a'的原子\n");DelAtom(g3,'a');printf(" 广义表g3:");DispGL(g3);printf("\n\n");printf(" 删除广义表g3中的所有'a'原子\n");DelAtomAll(g3,'a');printf(" 广义表g3:");DispGL(g3);printf("\n\n");g4=CreatGL(str4);printf(" 广义表g4:");DispGL(g4);printf("\n");printf(" 采用先根遍历g4的结果:");PreOrder(g4);printf("\n\n");}。
数据结构实验报告及心得体会

2011~2012第一学期数据结构实验报告班级:信管一班学号:201051018姓名:史孟晨实验报告题目及要求一、实验题目设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。
1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统),输出实验结果。
(15分)2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学生的学号、姓名和成绩。
3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。
二、实验要求1.修改算法。
将奇偶排序算法升序改为降序。
(15分)2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。
(45分))3.编译、链接以上算法,按要求写出实验报告(25)。
4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。
5.用A4纸打印输出实验报告。
三、实验报告说明实验数据可自定义,每种排序算法数据要求均不重复。
(1) 实验题目:《N门课程学生成绩名次排序算法实现》;(2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性;(3) 实验要求:对算法进行上机编译、链接、运行;(4) 实验环境(Windows XP-sp3,Visual c++);(5) 实验算法(给出四种排序算法修改后的全部清单);(6) 实验结果(四种排序算法模拟运行后的实验结果);(7) 实验体会(文字说明本实验成功或不足之处)。
三、实验源程序(算法)Score.c#include "stdio.h"#include "string.h"#define M 6#define N 3struct student{ char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M];void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){ flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/ if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j]>a[i+1].score[j]){ temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){ int i,k;printf(“ 奇偶交换成绩 %d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){ if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;p rintf(" %4d ",k);p rintf("%4d",a[i].number);p rintf(" %s",a[i].name);p rintf(" %6d",a[i].score[j]);p rintf("\n");}}main(){ int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{ printf("请输入第 %d 名学生分数: ",i+1);printf("\n"); printf("姓名: ");s canf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{ stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n"); k=1;for(i=0;i<M;i++){ if(i>0&&stu[i].score[N]!=stu[i-1].score[N])k++;printf("%4d",k);printf(" %4d",stu[i].number);printf(" %s",stu[i].name);for(j=0;j<N+1;j++)printf(" %6d",stu[i].score[j]);printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前 3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前 3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前 3 名同学成绩*/}源代码结果:请输入第1 名学生分数: 姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数: 姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第 3 名学生分数: 姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数: 姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数: 姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数: 姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 5 张一析78 68 91 2372 2 袁欣78 80 92 2503 4 滕芷79 84 88 2514 6 白晓彤88 76 90 2545 1 史孟晨87 90 78 2556 3 赵宇88 76 95 259 奇偶交换成绩1 排序表名次学号姓名分数1 5 张一析781 2 袁欣782 4 滕芷793 1 史孟晨87奇偶交换成绩2 排序表名次学号姓名分数1 5 张一析682 6 白晓彤762 3 赵宇763 2 袁欣80奇偶交换成绩3 排序表名次学号姓名分数1 1 史孟晨782 4 滕芷883 6 白晓彤90Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i;struct student temp;while(flag){flag=0;for(i=1;i<n-1;i+=2) /*对所有奇数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}for(i=0;i<n-1;i+=2) /*对所有偶数项进行一遍比较*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 奇偶交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}升序改降序:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 奇偶交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79奇偶交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 奇偶交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int flag=1,i,m,k;struct student temp;while(flag){flag=0;for(i=0;i<n-1;i++) /*选择排序法*/{k=i;for(m=i+1;m<n;m++)if (a[m].score[j]>a[k].score[j]){k=m;temp=a[i];a[i]=a[k];a[k]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 选择交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}简单选择:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 选择交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79选择交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80 选择交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continue#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){{int flag=1,i;struct student temp;while(flag){flag=0;for(i=0;i<n;i++) /*冒泡排序法*/if (a[i].score[j] < a[i+1].score[j]){temp=a[i];a[i]=a[i+1];a[i+1]=temp;flag=1;}}}}void print_score(struct student a[],int n,int j){int i,k;printf(" 冒泡交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}运行结果:请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 冒泡交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79冒泡交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80冒泡交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91 Press any key to continueJusertsort.c#include "stdio.h"#include "string.h"#define M 6#define N 3void changesort(struct student a[],int n,int j);void print_score(struct student a[],int n,int j);struct student{char name[10];int number;int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/}stu[M];main(){int i,j,k;for (i=0;i<M;i++) /*输入每个学生信息*/{printf("请输入第%d 名学生分数: ",i+1);printf("\n");printf("姓名: ");scanf("%s",stu[i].name);printf("编号: ");scanf("%4d",&stu[i].number);printf("数据结构: ");scanf("%4d",&stu[i].score[0]);printf("离散数学: ");scanf("%4d",&stu[i].score[1]);printf("大学英语: ");scanf("%4d",&stu[i].score[2]);}for(i=0;i<M;i++) /*计算每个学生总分*/{stu[i].score[N]=0;for(j=0;j<N;j++)stu[i].score[N]+=stu[i].score[j];}changesort(stu,M,N); /*对总分进行排序*/printf(" 学生总分成绩排序表\n");printf(" 名次学号姓名数据结构离散数学大学英语总分\n");k=0;for(i=0;i<M+1;i++){if(i>0&&stu[i].score[N]!=stu[i-1].score[N]){k++;printf("%4d",k);printf(" %4d",stu[i-1].number);printf(" %s",stu[i-1].name);for(j=0;j<N+1;j++){printf(" %6d",stu[i-1].score[j]);}}printf("\n");}changesort(stu,M,0); /*对数据结构成绩进行排序*/print_score(stu,M,0); /*输出数据结构前3 名同学成绩*/changesort(stu,M,1); /*对离散数学成绩进行排序*/print_score(stu,M,1); /*输出离散数学前3 名同学成绩*/changesort(stu,M,2); /*对大学英语成绩进行排序*/print_score(stu,M,2); /*输出大学英语前3 名同学成绩*/}void changesort(struct student a[],int n,int j){int i, m;struct student temp;/*插入排序法*/for(i=1; i<n; i++){temp = a[i];for(m=i; m>0 && temp.score[j] > a[m-1].score[j]; m--){a[m] = a[m-1];}a[m] = temp;}}void print_score(struct student a[],int n,int j){int i,k;printf(" 插入交换成绩%d 排序表",j+1);printf("\n");printf(" 名次学号姓名分数\n");k=1;for(i=0;k<N&&i<n;i++){if(i>0&&a[i].score[j]!=a[i-1].score[j])k++;printf(" %4d ",k);printf("%4d",a[i].number);printf(" %s",a[i].name);printf(" %6d",a[i].score[j]);printf("\n");}}请输入第1 名学生分数:姓名: 史孟晨编号: 01数据结构: 87离散数学: 90大学英语: 78请输入第2 名学生分数:姓名: 袁欣编号: 02数据结构: 78离散数学: 80大学英语: 92请输入第3 名学生分数:姓名: 赵宇编号: 03数据结构: 88离散数学: 76大学英语: 95请输入第4 名学生分数:姓名: 滕芷编号: 04数据结构: 79离散数学: 84大学英语: 88请输入第5 名学生分数:姓名: 张一析编号: 05数据结构: 78离散数学: 68大学英语: 91请输入第6 名学生分数:姓名: 白晓彤编号: 06数据结构: 88离散数学: 76大学英语: 90学生总分成绩排序表名次学号姓名数据结构离散数学大学英语总分1 3 赵宇88 76 95 2592 1 史孟晨87 90 78 2553 6 白晓彤88 76 90 2544 4 滕芷79 84 88 2515 2 袁欣78 80 92 2506 5 张一析78 68 91 237 插入交换成绩1 排序表名次学号姓名分数1 3 赵宇881 6 白晓彤882 1 史孟晨873 4 滕芷79插入交换成绩2 排序表名次学号姓名分数1 1 史孟晨902 4 滕芷843 2 袁欣80插入交换成绩3 排序表名次学号姓名分数1 3 赵宇952 2 袁欣923 5 张一析91Press any key to continue心得体会本学期开设的《数据结构基础》课程已经告一段落,现就学习体会进行学习总结.这是一门纯属于设计的科目,它需用把理论变为上机调试。
数据结构实验一顺序表

数据结构实验一1、实验目的∙掌握线性表的逻辑特征∙掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算2、实验内容:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:∙创建一个新的顺序表,实现动态空间分配的初始化;∙根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;∙根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);∙利用最少的空间实现顺序表元素的逆转;∙实现顺序表的各个元素的输出;∙彻底销毁顺序线性表,回收所分配的空间;∙对顺序线性表的所有元素删除,置为空表;∙返回其数据元素个数;∙按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;∙按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;∙判断顺序表中是否有元素存在,对判断结果进行返回;.编写主程序,实现对各不同的算法调用。
2.实现要求:∙“初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;∙“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;∙“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;∙“逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;∙“输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;∙“销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;∙“置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;∙“求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;∙“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值∙“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;∙“判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
数据结构上机实验题
当涉及数据结构的上机实验题时,通常会涉及编程和算法的实践。
以下是一些可能的
上机实验题目:
1. 实现一个栈(Stack)数据结构,并编写基本的操作(入栈、出栈、获取栈顶元素等)。
2. 实现一个队列(Queue)数据结构,并编写基本的操作(入队、出队等)。
3. 实现一个链表(Linked List)数据结构,并编写插入、删除、查找等操作。
4. 实现一个二叉树(Binary Tree)数据结构,并编写遍历算法(前序、中序、后序遍历)。
5. 实现一个图(Graph)数据结构,并编写基本的图算法(深度优先搜索、广度优先搜索)。
6. 实现一个哈希表(Hash Table)数据结构,并编写插入、删除、查找等操作。
这些实验题目可以帮助学生加深对数据结构的理解,并通过编程实践来掌握数据结构
的基本操作和算法。
同时,这些实验也有助于提高学生的编程能力和解决问题的能力。
数据结构实验题目
实验题目一一、单链表基本运算【问题描述】设计并实现线性表的单链表存储和运算。
【基本要求】实现单链表的插入、删除和遍历运算,每种操作用一个函数实现。
插入操作:将一个新元素插入表中指定序号的位置。
删除操作:将指定序号的元素从表中删除。
遍历操作:从表头按次序输入所有元素的值,若是空表,则输出信息“empty list!”。
【实现提示】程序运行时,首先在main函数中创建空的、带头结点的单链表。
然后多次调用实现插入操作的函数(每次都将元素在序号1位置上插入),将元素依次插入表中,最后调用实现遍历操作的函数输出所有元素。
之后再多次调用实现删除操作的函数将表还原为空表(每次都删除第1个元素,每删除一个元素后,将表中剩余元素都输出一次)。
【测试数据】输入数据:1 2 3 4 5 0(为0时结束,0不存入链表)第一次输出:5 4 3 2 1第二次输出:4 3 2 1第三次输出:3 2 1第四次输出:2 1第五次输出:1第六次输出:empty list!二、约瑟夫环问题【问题描述】编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。
现在给定一个随机数m>0,从编号为1的人开始,按顺时针方向1开始顺序报数,报到m时停止。
报m的人出圈,同时留下他的密码作为新的m值,从他在顺时针方向上的下一个人开始,重新从1开始报数,如此下去,直至所有的人全部出列为止。
【基本要求】利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。
【测试数据】M的初始值为20;n等于7,7个人的密码依次为:3,1,7,2,4,8,4。
输出为:6,1,4,7,2,3,5【实现提示】程序运行时,首先要求用户指定初始报数上限值,然后读取各人的密码。
可设n≤30。
此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。
【选作内容】用顺序存储结构实现该题目。
三、一元多项式相加、减运算器【问题描述】设计一个一元稀疏多项式简单计算器。
数据结构习题与实验指导
第一部分习题第一章绪论一.单选题1.若一个数据具有集合结构,则元素之间具有()。
A.线性关系B.层次关系C.网状关系D.无任何关系2.下面程序段的时间复杂度为()。
int i,j;for(i=0;i<m;i++)for(j=0;j<n;j++)a[i][j]=i*j;A.O(m2) B.O(n2) C.O(mхn) D.O(m+n)3.执行下面程序段时,S语句被执行的次数为()。
int i,j;for(i=1;i<=n;i++)for(j=1;j<=i;j++)S;A.n2B.n2/2 C.n(n+1) D.n(n+1)/2二.填空题1.数据的逻辑结构被分为_____________、_____________、_____________和_____________四种。
2.数据的存储结构被分为_____________、_____________、_____________和_____________四种。
3.在线性结构、树结构和图结构中,前驱和后继结点之间分别存在着_____________、_____________和_____________的联系。
4.在C语言中,一个数组a所占有的存储空间的大小即数组长度为_____________,下标为i的元素a[i]的存储地址为_____________。
5.在下面程序段中,s=s+p语句的执行次数为_____________,p*=j语句的执行次数为_____________,该程序段的时间复杂度为_____________。
int i=0,s=0;while(++i<=n){ int j,p=1;for(j=1;j<=i;j++) p*=j;s=s+p;}6.某算法仅含2个语句,其执行次数分别为1000n2和0. 01n3,则该算法的时间复杂度为_____________。
7.一个算法的时间复杂度为(3n2+2nlog2n+4n-7)/(5n),其数量级表示为__________。
数据结构--实验报告 线性表的基本操作
一、实验目的二、实验内容和要求三、源代码1)顺序表的代码2)单链表的代码四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会实验一线性表的基本操作及其应用一、实验目的1、帮助读者复习C++语言程序设计中的知识。
2、熟悉线性表的逻辑结构。
3、熟悉线性表的基本运算在两种存储结构上的实现。
4、掌握顺序表的存储结构形式及其描述和基本运算的实现。
5、熟练掌握动态链表结构及有关算法的设计二、实验内容题目一:顺序表的基本操作[问题描述]实现顺序表的建立、求长度,取元素、修改元素、插入、删除等顺序表的基本操作。
[基本要求](1)依次从键盘读入数据,建立带头结点的顺序表;(2)输出顺序表中的数据元素(3)求顺序表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
(6)根据算法,将两个有序的顺序表合并成一个有序顺序表。
[测试数据] 由学生任意指定。
题目二:单链表的基本操作[问题描述]实现带头结点的单链表的建立、求长度,取元素、修改元素、插入、删除等单链表的基本操作。
[基本要求](1)依次从键盘读入数据,建立带头结点的单链表;(2)输出单链表中的数据元素(3)求单链表的长度;(4)根据指定条件能够取元素和修改元素;(5)实现在指定位置插入和删除元素的功能。
(6)根据算法,将两个有序的单链表合并成一个有序单链表。
[测试数据]由学生任意指定。
三、源代码(一)顺序表的基本操作#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++)L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void chaxun(SqList &L1) //取第i个位置的元素{ int j;ElemType e1;cout<<"请选择所要取出元素的位置:";while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>j; }GetElem(L1,j,e1);cout<<"取出的元素为:"<<e1<<endl; }void xiugai(SqList &L1) //修改第i个位置的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要修改元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要修改元素的位置:";cin>>j; }cout<<"要修改成的元素:";cin>>e1;Listxiugei(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度:"; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度:"; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<" 顺序表的基本操作"<<endl;cout<<" 1.顺序表的创建"<<endl;cout<<" 2.顺序表的显示"<<endl;cout<<" 3.顺序表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到顺序表里"<<endl;cout<<" 7.删除顺序表里的元素"<<endl;cout<<" 8.合并两个顺序表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break; case 4: chaxun(Lx);break;case 5: xiugai(Lx);break;case 6: charu(Lx);break;case 7: shanchu(Lx);break;case 8: hebing(Lx);break;case 9: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误,请重新选择"<<endl;break; }}}(二)单链表的基本操作#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在 e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<" 单链表的基本操作"<<endl;cout<<" 1.单链表的创建"<<endl;cout<<" 2.单链表的显示"<<endl;cout<<" 3.单链表的长度"<<endl;cout<<" 4.取第i个位置的元素"<<endl;cout<<" 5.修改第i个位置的元素"<<endl;cout<<" 6.插入元素到单链表里"<<endl;cout<<" 7.删除单链表里的元素"<<endl;cout<<" 8.合并两个单链表"<<endl;cout<<" 9.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择所要取出元素的位置:";while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要取出元素的位置:";cin>>x; }GetElem(list,x,y);cout<<"该位置的元素为:"<<y<<endl;break;case 5: xiugai(list); break;case 6: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 7: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 8: hebing();break;case 9: exit(0);default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、测试结果1)顺序表的测试结果2)单链表的测试结果五、心得体会当听到老师说写数据结构实验报告时,我有点惊讶,才学了不到一个月,就要写实验报告。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、编写函数,先建立如下的数组,再删除数组中的元素50。
(用线性表的顺序表示实现)(测试题1)将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include"stdio.h"int main(){int a[101];int i;for(i=0;i<=100;i++){a[i]=i+1;}for(i=50;i<=100;i++)a[i-1]=a[i];for(i=0;i<=100;i++)printf("%4d",a[i]);return 0;}2、编写函数,先建立如下的数组,再直接在元素25之前插入元素20。
(用线性表的顺序表示实现)(测试题2)将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include"stdio.h"int main(){int a[17];int i;for(i=1;i<=16;i++){a[i]=i*i;}for(i=15;i>=5;i--)a[i+1]=a[i];for(i=1;i<=16;i++)printf("%4d",a[i]);return 0;}3、设顺序表va中的数据元素递增有序。
试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。
(课后题2.11)将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include"stdio.h"int main(){int a[12],x,y;for(int i=1;i<=10;i++)a[i]=i+1;for(i=1;i<=10;i++)printf("%4d",a[i]);scanf("%d",&x);for(i=1;i<=10;i++)if(x<=a[i]){y=i; break;}for(i=11;i>=y+1;i--)a[i]=a[i-1];a[i]=x;for(i=1;i<=11;i++)printf("%4d",a[i]);printf("\n");return 0;}4、试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,a3,…,a n)逆置为(a n,a n-1,…,a2,a1)。
(课后题 2.21)将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include"stdio.h"int main(){for(i=0;i<=9;i++)a[i]=i;for(i=9;i>=0;i--)printf("%d",a[i]);printf("\n");return 0;}1、对10*10矩阵的前3行元素和前3列元素取反(用循环)。
#include"stdio.h"int main(){int a[10][10];inti,j,k=1;for(i=0;i<10;i++)for(j=0;j<10;j++)a[i][j]=k++;for(i=0;i<=3;i++)for(j=0;j<10;j++)a[i][j]=-a[i][j];for(i=3;i<10;i++)for(j=0;j<3;j++)a[i][j]=-a[i][j];for(i=0;i<10;i++){ for(j=0;j<10;j++)printf("%4d",a[i][j]);printf("\n");}}2、对10*10矩阵的右下角15个元素取反(用循环)。
#include"stdio.h"int main(){int a[10][10];inti,j,k=1;for(i=0;i<10;i++)for(j=0;j<10;j++)a[i][j]=k++;for(i=0;i<10;i++)for(j=0;j<10;j++)if(i+j>=14)a[i][j]=-a[i][j];for(i=0;i<10;i++){for(j=0;j<10;j++)printf("%4d",a[i][j]);printf("\n");}}3、编写如下定义的递归函数的递归算法,并计算g(5,2)的值(题集3.24)。
g m ,n = 0 m =0,n ≥0g m −1,2n +n m >0,n ≥0#include"stdio.h"#define ERROR -32767 int g(intm,int n); main() { intm,n; scanf("%d%d",&m,&n); printf("result=%d",g(m,n)); }int g(intm,int n) { if(m<0||n<0) return ERROR; if(m==0&&n>=0) return 0; else return g(m-1,2*n)+n; }4、若矩阵A m*n 中的某个元素a ij 是第i 行中的最小值,同时又是第j 列中的最大值,则称此元素为该矩阵中的一个马鞍点。
假设以二维数组存储矩阵A m*n ,试编写求出矩阵中所有马鞍点的算法。
(题集5.19)例如:4675839218765844931234345655894138无马鞍点 一个马鞍点 两个马鞍点1、将n 个互不相等的整数存储到一维数组中,在存储时对已有数据进行检查,若发现当前输入的数据已经存在,则重新输入。
要求用指针实现编程。
#include"stdio.h" #define N 10bool what(int *a,int *p,int count); void main() { int count=0,b; int a[N]; int i,*p=&b,*q=a; while(count<N) { printf("\nplease enter a integer:"); scanf("%d",p); if(!what(a,p,count))//相等返回1 { *(q+count)=*p; count++; } } printf("\n the result is:"); for(i=0;i<count;i++) printf("%3d",*(q+i)); }bool what(int *a,int *p,int count) { int i; for(i=0;i<count;i++) if(*(a+i)==*p) { return 1; break; } return 0; }2、利用子函数完成 i !10i =1#include"stdio.h" doublegetjc(int i); void main() {double sum=0; int i;for(i=1;i<=10;i++) {sum+=getjc(i);}printf("\nsum=%lf",sum);}doublegetjc(int i){int j;doublecj=1;for(j=1;j<=i;j++)cj=cj*j;returncj;}一、用二重循环输出下述图形。
#include"stdio.h"main(){inti,j,k;for(i=1;i<=5;i++){for(j=1;j<=(10-2*i);j++){printf(" ");}for(k=1;k<=(4*i-3);k++){printf("*",4*i-3);}printf("\n");}return 0;}1、试写一算法,自小至大依次输出顺序读入的三个整数X、Y、Z的值。
(可参照数据结构题集1.16)将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include "stdio.h"void main(){intx,y,z;scanf("%d%d%d",&x,&y,&z);void fun(int *x,int *y,int*z);fun(&x,&y,&z);printf("结果:\n%d\n%d\n%d\n",x,y,z);}void fun(int *x,int *y,int*z){int t;if(*x>*y){t=*x;*x=*y;*y=t;}if(*y>*z){t=*z;*z=*y;}if(*x<t)*y=t;else{*y=*x;*x=t;}}2、已知5阶斐波那契序列的定义为:f(0)=0, f(1)=0, f(2)=0, f(3)=0, f(4)=1;f(k)=f(k-1)+ f(k-2)+ f(k-3)+ f(k-4)+ f(k-5)编写求5阶斐波那契序列第30项的值。
将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include "stdio.h"void main(){int f[30],i;f[0]=0;f[1]=0;f[2]=0;f[3]=0;f[4]=1;for(i=5;i<=29;i++)f[i]=f[i-1]+f[i-2]+f[i-3]+f[i-4]+f[i-5];for(i=0;i<=29;i++)printf("f[%d]=%d\n",i,f[i]);}3、(选做)列举偶数100可分解为哪两个素数之和?如:100=3+97…100=47+53将代码粘贴在下面,并将运行结果窗口用屏幕抓图方式粘贴在代码之后。
#include "stdio.h"#include "math.h"void main(){int i;int tell(int x);for(i=3;i<=49;i=i+2){if( tell(i)&&tell(100-i) )printf("100=%d+%d\n",i,100-i);}}int tell(int x){for(int i=2;i<=sqrt(x);i++){if(x%i==0)return 0;}return 1;}4、(选做)键盘输入月、日,计算该日是2015年的第几天?如:输入3,1 输出60。