1、太原理工大学现代科技学院数字测控实习报告 4太原理工大学现代科技学院 数据结构 课程 实验报告 专业班级 计算机科学与技术14-2班学 号 2014101952 姓 名 王晓姝 指导教师 邓丽平 装订线 实验名称 单向链表的操作 同组人 专业班级 计科14-2 学号 2014101952 姓名 王晓姝 成绩 一、实验目的:1。掌握单向链表的存储特点及其实现;2掌握单向链表的插入、删除算法及其应用算法的程序实现二、实验内容: 1。键盘输入一组元素,建立一个带头结点的单向链表(无序)2遍历单向链表、3在单向链表中删除元素E;4单向链表的逆置5设计一个MAIN()函数,分别调试上述算法。三、实验环境
2、:Microsoft Visual C+6.04、主要算法#include#include#include#include#include#includetypedef struct LNode int data; struct LNode* next;LNode,*Linklist;int count=0,flag=0;Linklist add()/*初始化*/ Linklist head,p1,p2; count=0; head=p2=(Linklist)malloc(sizeof(LNode); do flag=0; p1=(Linklist)malloc(sizeof(LNode);
3、p2-next=p1; p1-next=NULL; printf(请输入一个数字:n); scanf(%d,&p1-data); p2=p1; count+; printf(继续输入按: 1 返回按: 0n); scanf(%d,&flag); while(flag=1); printf(你共输入了 %d 个元素.,count); printf(按任意键继续n); getch(); return(head);void visit(Linklist head)/*遍历*/ int i; Linklist p; p=head-next; for(i=1;idata); p=p-next; prin
4、tf(按任意键继续n); getch();void Dle(Linklist head)/*删除*/ if(!head-next) printf(链表为空!请先输入元素值n); else int e; Linklist p1,p2; p1=p2=head; printf(请输入一个要删除的元素值:n); scanf(%d,&e); while(p1-data!=e&p1-next!=NULL) p2=p1; p1=p1-next; if(p1-data=e) p2-next=p1-next; free(p1); count-; else printf(无此元素!n); void opp(Lin
5、klist head)/*逆置*/ Linklist p1,p,q; p=head-next; p1=p-next; p-next=NULL; while(p1-next!=NULL) q=p1; p1=p1-next; q-next=p; p=q; p1-next=q; head-next=p1; printf(逆置后的元素为:n); visit(head);void main() int c; Linklist L; do system(cls); printf(#数据结构 实验一 #n); printf(n); printf(输入元素按: 1 遍历按: 2 删除按: 3 逆置按: 4 退
6、出按: 0n); scanf(%d,&c); if(c=1) L=add(); continue; else if(c=2) if(count=0) printf(链表为空,请输入元素!n); printf(按任意键继续n); getch(); else printf(元素顺序为:n); visit(L); continue; else if(c=3) if(count=0) printf(链表为空,请输入元素!n); printf(按任意键继续n); getch(); else Dle(L); printf(删除后的元素为:n); visit(L); continue; else if(c=
7、4) if(count=0) printf(链表为空,请输入元素!n); printf(按任意键继续n); getch(); else opp(L); continue; else if(c=0) printf( 您已退出, 再见!n); exit(0); while(1);五、实验结果及分析输入元素 :6 7 8 4 1遍历元素顺序:6 7 8 4 1删除元素值 4 删除元素顺序为 6 8 4 1逆置的元素 1 4 8 6装订线实验名称 栈和队列 同组人 专业班级 计科14-2 学号 2014101952 姓名 王晓姝成绩 一、实验目的:1.编程实现进制转化和判断回文。2熟悉站和队列的操作。
8、2、实验内容实现十进制的转化和回文判断。三、实验环境:Microsoft Visual C+6.0四 主要算法栈的进制转化#include#include#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define selemtype int#define status int#define ok 1typedef struct selemtype * base; selemtype * top; int stacksize;sqstack;status initstack(sqstack &s) s.b
9、ase=(selemtype *)malloc(STACK_INIT_SIZE * sizeof(selemtype); if(!s.base) exit(0); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return ok;status stackempty(sqstack s) if(s.top=s.base) return 1; return 0;status push(sqstack &s,selemtype e) if(s.top-s.base=s.stacksize) s.base=(selemtype * )realloc(s.base
10、,(s.stacksize+STACKINCREMENT)*sizeof(selemtype); if(!s.base) exit(0); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; *s.top+=e; return ok; status pop(sqstack &s,selemtype &e) if(s.top=s.base) return 0; e=* -s.top; return ok;void conversion(int N,int M) int e; sqstack s; initstack(s); while(N
11、) push(s,N%M); N=N/M; while(!stackempty(s) if(M10) pop(s,e); if(e9) printf(%c,e+55); else printf(%d,e); else pop(s,e); printf(%d,e); printf(n按任意键继续n); getch();void main() int x,y,flag; do system(cls); printf(* 实验二 数制转换 *nnn); printf(进行数制转换 按: 1 退出 按: 0n); scanf(%d,&flag); if(flag) printf(请输入一个十进制的非负
12、数:n); scanf(%d,&x); printf(请输入要将它转换的进制数:n); scanf(%d,&y); printf(十进制的 %d 转化成 %d 进制为: ,x,y); conversion(x,y); while(flag);队列的回文判断#include#include#include#include#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef char SElemType;typedef char QElemType;#define status int#define ok 1int count;ty
13、pedef struct SElemType * base; SElemType * top; int stacksize;sqstack;status initstack(sqstack &s) s.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType); if(!s.base) exit(0); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return ok;status stackempty(sqstack s) if(s.top=s.base) return 1; return
14、0;status push(sqstack &s,SElemType e) if(s.top-s.base=s.stacksize) s.base=(SElemType * )realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType); if(!s.base) exit(0); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; *s.top+=e; return ok; status pop(sqstack &s,SElemType &e) if(s.top=s.base
15、) return 0; e=* -s.top; return ok;typedef struct SElemType *base; SElemType *top; int stacksize;SqStack;typedef struct QNode QElemType data; struct QNode *next;QNode,*QueuePtr;typedef struct QueuePtr front;/队头指针 QueuePtr rear;LinkQueue;int InitQueue(LinkQueue &Q) /构造一个空队列Q Q.front=Q.rear=(QueuePtr)m
16、alloc(sizeof(QNode); if(!Q.front)exit(0); Q.front-next=NULL; return 1;int EnQueue(LinkQueue &Q,QElemType e) /插入元素e为Q的新的队尾元素 QueuePtr p; p=(QueuePtr)malloc(sizeof(QNode); if(!p)exit(0); p-data=e;p-next=NULL; Q.rear-next=p; Q.rear=p; return 1;int DeQueue(LinkQueue &Q,QElemType &e) /若队列不空,则删除Q的队头元素,用e返
17、回其值,并返回OK;否则返回ERROR QueuePtr p; if(Q.front=Q.rear)return 0; p=Q.front-next; e=p-data; Q.front-next=p-next; if(Q.rear=p)Q.rear=Q.front; free(p); return 1;void input(sqstack &s,LinkQueue &q) int flag=0; char c; count=0; printf(请输入一串字符,按回车结束输入!n); fflush(stdin);/*清除缓冲*/ while(c=getchar()!=n) push(s,c);
18、 EnQueue(q,c); count+; printf(你共输入了 %d 个元素n,count); void check(sqstack &s,LinkQueue &q) char e1,e2; int i,key=0; for(i=1;i=count/2;i+) pop(s,e1); DeQueue(q,e2); if(e1=e2) key+; if(key=count/2) printf(是回文n); printf(n按任意键继续n); getch(); else printf(不是回文n); printf(n按任意键继续n); getch(); void main() int c;
19、do system(cls); printf(# 实验二判断回文 #nn); printf(按1进行输入和判断 按0 退出n); scanf(%d,&c); if(c) sqstack s; LinkQueue q; InitQueue(q); initstack(s); input(s,q); check(s,q); else exit(0); while(c); printf(你已经退出,再见n);5、实验结果及分析栈 输入十进制的非负数 52 转化为二进制 110100 转化为八进制 64 转化为十六进制 34队列 输入字符串adfgfh 不是回文装订线实验名称 遍历二叉树 同组人 专业
20、班级 计科14-2 学号 2014101952 姓名 王晓姝 成绩 一、实验目的:1,掌握遍历二叉树的先序,中序,后序2,掌握叶子结点的算法二 实验内容遍历二叉树的先序,中序,后序递归排序和计算叶子结点。三、实验环境:Microsoft Visual C+6.0四 主要算法#include#include#include#include#include#include #define maxsize 1000typedef char elemtype;typedef struct bitree elemtype data; struct bitree *lchild,*rchild;BiTre
21、e,*TBiTree;#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define selemtype TBiTree#define status int#define ok 1int count;typedef struct selemtype * base; selemtype * top; int stacksize;sqstack;status initstack(sqstack &s) s.base=(selemtype *)malloc(STACK_INIT_SIZE * sizeof(selemtype); if(!s.b
22、ase) exit(0); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return ok;status stackempty(sqstack s) if(s.top=s.base) return 1; return 0;status push(sqstack &s,selemtype e) if(s.top-s.base=s.stacksize) s.base=(selemtype * )realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(selemtype); if(!s.base) exit(0)
23、; s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; *s.top+=e; return ok; status pop(sqstack &s,selemtype &e) if(s.top=s.base) return 0; e=* -s.top; return ok;BiTree *create() BiTree *q100; /定义q数组作为队列存放二叉链表中结点,100为最大容量BiTree *s; /二叉链表中的结点BiTree *root ; /二叉链表的根指针int front=1,rear=0; /定义队列的头、尾指针ch
24、ar ch; /结点的data域值root=NULL;printf(请输入一组字符,按 # 结束n);cinch;while(ch!=#) /输入值为#号,算法结束 s=NULL;if(ch!=,) /输入数据不为逗号,表示不为虚结点,否则为虚结点 s=new BiTree;s-data=ch;s-lchild=NULL;s-rchild=NULL;rear+;qrear=s; /新结点或虚结点进队if(rear=1)root=s;count+;else if(s!=NULL)&(qfront!=NULL) if(rear%2=0) qfront-lchild=s;count+; /rear为
25、偶数,s为双亲左孩子 else qfront-rchild=s;count+;/rear为奇数,s为双亲右孩子 if(rear%2=1) front+; /出队cinch;return root;int visit(char c)/遍历 printf(%c,c); return 1;int dpreordertraverse(TBiTree t)/递归先序 if(t) visit(t-data); dpreordertraverse(t-lchild); dpreordertraverse(t-rchild); return 0; else return 1;int dinordertraverse(TBiTree t)/递归中序 if(t) dinordertraverse(t-lchild); visit(t-data); dinordertraverse(t-rchild); return 0; else return
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1