计算机软件实验报告1_第1页
计算机软件实验报告1_第2页
计算机软件实验报告1_第3页
计算机软件实验报告1_第4页
计算机软件实验报告1_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一单链表的运算源程序:#include<stdio.h>#include<stdlib.h>/*单链表的定义*/typedefintDataType; /*DataType可以是任何相应的数据类型如int,float或char*/typedefstructnode /*结点类型定义*/{ DataTypedata; /*结点的数据域*/ structnode*next; /*结点的指针域*/}ListNode;typedefListNode*LinkList;inti;DataTypekey,x;LinkListhead;ListNode*p;/*单链表的建立,从后向前生成*/LinkListCreateList(void) LinkListp=NULL,q; intx; scanf("%d",&x); while(x!=0) q=(LinkList)malloc(sizeof(ListNode)); q->data=x; q->next=p; p=q; scanf("%d",&x); returnp;/*单链表的打印*/voidPrintList(LinkListhead) LinkListp; p=head; if(p==NULL) printf("单链表为空\n"); while(p!=NULL) printf("%d",p->data); p=p->next; printf("\n");/*单链表的查找,输入一个整数,显示该结点的位置*/LinkListLocateNode(DataTypekey){/*在不带头结点的单链表head中查找其值为key的结点*/ LinkListp; p=head; while(p!=NULL) if(p->data==key) break; p=p->next; if(p==NULL) printf("没有key这个值\n"); else printf("找到key\n"); returnp;/*单链表的查找2,在不带头结点的单链表head中查找第i个结点*/LinkListGetNode(inti) LinkListp;intj=0; if(i<0) printf("ERROR\n"); exit(1); p=head; do j++; if(j==i) break; p=p->next; while(p!=NULL); if(p==NULL) printf("没有第i个结点\n"); returnp;/*单链表的插入*/voidInsertList(DataTypex,inti){/*将值为x的新结点插入到不带头结点的单链表head的第i个结点的位置上*/ LinkListp,q; if(i==1) q=(LinkList)malloc(sizeof(ListNode)); q->data=x; q->next=head; head=q; else p=GetNode(i-1); if(p==NULL) printf("无法插入\n"); else q=(LinkList)malloc(sizeof(ListNode)); q->data=x; q->next=p->next; p->next=q;/*单链表的删除,删除不带头结点的单链表中的第i个结点*/voidDeleteList(inti) LinkListp,q; if(head==NULL) printf("无法删除\n"); exit(0); if(i==1) head=head->next; else p=GetNode(i-1); if(p==NULL||p->next==NULL) printf("无法删除\n"); exit(1); else q=p->next; p->next=q->next;voidmain() printf("输入单链表的值:\n"); head=CreateList(); /*建立单链表*/ PrintList(head); /*打印单链表*/ printf("输入要查找的值:\n"); scanf("%d",&key); p=LocateNode(key); /*单链表查找*/ printf("请输入欲插入元素的位置:\n"); scanf("%d",&i); printf("请输入欲插入的元素:\n"); scanf("%d",&x); InsertList(x,i); /*单链表插入*/ PrintList(head); /*打印单链表*/ printf("请输入欲删除结点的位置:\n"); scanf("%d",&i); DeleteList(i); /*单链表删除*/ PrintList(head); /*打印单链表*/运行结果:运行结果基本符合实验要求,实验完成。实验中出现的问题与对问题的解决方案不能在位置1插入元素,并且不能删除第一个节点。原因是在插入和删除函数中将head作为形参传递,只传递了head指向的地址,不管对形参如何修改,并不能改变head的值。解决方案是将head作为全局变量,并且不用head形参传输,直接对head进行修改。当输入插入元素位置i小于零时,程序运行错误。原因是在GetNode()函数中没有对应i小于零的情况。解决方案是在GetNode()种添加对应i小于零的情况。当删除第i(i>1)个结点时,删除的是地i+1个结点。原因是在删除时是删除的查找到的元素后面的元素。解决方案是在查找时直接查找第i-1个结点,这样删除的元素便是第i个。当单链表中有i个元素时,若输入欲删除结点为i+1时,程序运行错误。原因是此时查找到的元素是第i个p->=NULL,无法执行q=p->next;p->next=q->next;语句。解决方案是在p->=NULL时,直接显示“无法删除”。思考题如果生成带头结点的单链表,程序应如何修改?答:修改后的程序为:#include<stdio.h>#include<stdlib.h>/*单链表的定义*/typedefintDataType; /*DataType可以是任何相应的数据类型如int,float或char*/typedefstructnode /*结点类型定义*/{ DataTypedata; /*结点的数据域*/ structnode*next; /*结点的指针域*/}ListNode;typedefListNode*LinkList;/*单链表的建立,从后向前生成*/LinkListCreateList(void) LinkListp=NULL,q; intx; scanf("%d",&x); while(x!=0) q=(LinkList)malloc(sizeof(ListNode)); q->data=x; q->next=p; p=q; scanf("%d",&x); returnp;/*单链表的打印*/voidPrintList(LinkListhead) LinkListp; p=head->next; if(p==NULL) printf("单链表为空\n"); while(p!=NULL) printf("%d",p->data); p=p->next; printf("\n");/*单链表的查找,输入一个整数,显示该结点的位置*/LinkListLocateNode(LinkListhead,DataTypekey){/*在带头结点的单链表head中查找其值为key的结点*/ LinkListp; p=head; while(p!=NULL) if(p->data==key) break; p=p->next; if(p==NULL) printf("没有key这个值\n"); else printf("找到key\n"); returnp;/*单链表的查找2,在\带头结点的单链表head中查找第i个结点*/LinkListGetNode(LinkListhead,inti) LinkListp;intj=0; p=head; if(i<=0) printf("ERROR\n"); exit(1); while(p!=NULL) j++; if(j==i) break; p=p->next; if(p==NULL) printf("没有第i个结点\n"); returnp;/*单链表的插入*/voidInsertList(LinkListhead,DataTypex,inti){/*将值为x的新结点插入到带头结点的单链表head的第i个结点的位置上*/ LinkListp,q; p=GetNode(head,i); if(p==NULL) printf("无法插入\n"); else q=(LinkList)malloc(sizeof(ListNode)); q->data=x; q->next=p->next; p->next=q;/*单链表的删除,删除带头结点的单链表中的第i个结点*/voidDeleteList(LinkListhead,inti) LinkListp,q; p=GetNode(head,i); if(head->next==NULL||p==NULL||p->next==NULL) printf("无法删除\n"); exit(0); else q=p->next; p->next=q->next;voidmain() inti; DataTypekey,x; LinkListhead; ListNode*p; p=(LinkList)malloc(sizeof(ListNode)); p->next=NULL; head=p; printf("输入单链表的值:\n"); head->next=CreateList(); /*建立单链表*/ PrintList(head); /*打印单链表*/ printf("输入要查找的值:\n"); scanf("%d",&key); p=LocateNode(head,key); /*单链表查找*/ printf("请输入欲插入元素的位置:\n"); scanf("%d",&i); printf("请输入欲插入的元素:\n"); scanf("%d",&x); InsertList(head,x,i); /*单链表插入*/ PrintList(head); /*打印单链表*/ printf("请输入欲删除结点的位置:\n"); scanf("%d",&i); DeleteList(head,i); /*单链表删除*/ PrintList(head); /*打印单链表*/实验总结通过这个实验加深了我对单链表的认识,学会了简单单链表的建立,查找,插入和删除等基本运算,并对运用C语言上机调试单链表的基本方法有了初步了解。通过这个实验也使我认识到自己编程能力较差,在以后的学习中,应该加强编程方面的学习。实验二二叉树的建立和遍历//要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子与结点总数的操作等

#include<stdio.h>

#include<string.h>

#include<malloc.h>

#include<stdlib.h>

#defineNULL0

typedefcharDataType;typedefstructBinTNode

{

DataTypedata;

structBinTNode*rchild,*lchild;

}BinTNode,*BinTree;

//创建二叉数

voidCreate(BinTree*T)

{

charch;

if((ch=getchar())=='*')//输入'*'时该节点为空

*T=NULL;

else

{

*T=(BinTree)malloc(sizeof(BinTNode));

(*T)->data=ch;

Create(&(*T)->lchild);

Create(&(*T)->rchild);

}

}

//先序遍历二叉树

voidPreOrder(BinTreeT)

{

if(T)

{

printf("%c",T->data);

PreOrder(T->lchild);

PreOrder(T->rchild);

}

}

//中序遍历二叉树

voidInOrder(BinTreeT)

{

if(T)

{

InOrder(T->lchild);

printf("%c",T->data);

InOrder(T->rchild);

}

}

//后序遍历二叉树

voidPostOrder(BinTreeT)

{

if(T)

{

PostOrder(T->lchild);

PostOrder(T->rchild);

printf("%c",T->data);

}

}

//用广义表表示二叉树

voidListPrint(BinTreeT)

{

if(T)

{

printf("%c",T->data);

if(T->lchild!=NULL||T->rchild!=NULL)

{

printf("(");

ListPrint(T->lchild);

if(T->lchild!=NULL)

printf(",");

ListPrint(T->rchild);

printf(")");

}

}

}

//用凹入表表示二叉树

voidDisplayPrint(BinTreeT,intlay)

{

if(T==NULL)

return;

for(inti=0;i<lay;i++)

printf("");

printf("%c\n",T->data);

DisplayPrint(T->lchild,lay+1);

DisplayPrint(T->rchild,lay+1);

}

//求结点的个数

intNode(BinTreeT)

{

intstaticN=0;

if(T)

{

Node(T->lchild);

N++;

Node(T->rchild);

}

returnN;

}

//求叶子的个数

intLeaf(BinTreeT)

{

intstaticL=0;

if(T)

{

Leaf(T->lchild);

if(!(T->lchild||T->rchild))//没有左子树和右子树,就是叶子

L++;

Leaf(T->rchild);

}

returnL;

}

//交换左子树和右子树

voidChange(BinTree*T)

{

if(*T)

{

BinTNode*temp;

Change(&(*T)->lchild);

Change(&(*T)->rchild);

temp=(*T)->lchild;

(*T)->lchild=(*T)->rchild;

(*T)->rchild=temp;

}

}voidmain()

{

BinTreeT;

printf("输入先序序列:");

Create(&T);

printf("输出先序遍历:");

PreOrder(T);

printf("\n");

printf("输出中序遍历:");

InOrder(T);

printf("\n");

printf("输出后序遍历:");

PostOrder(T);

printf("\n");

printf("输出广义表表示法:");

ListPrint(T);

printf("\n");

printf("输出凹入表表示法:\n");

DisplayPrint(T,1);

printf("结点的个数:nodes=%d\n",Node(T));

printf("叶子的个数:leaves=%d\n",Leaf(T));

Change(&T);

printf("交换左右子树,并用广义表表示法:");

ListPrint(T);

printf("\n");

}思考题#include<stdio.h>#include<stdlib.h>typedefstructBiTNode chardata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;voidCreatBiTree(BiTree&T){//前序法创建二叉树 charch; if((ch=getchar())=='\n') T=NULL; else T=(BiTNode*)malloc(sizeof(BiTNode)); if(!T) exit(1); T->data=ch; CreatBiTree(T->lchild); CreatBiTree(T->rchild);实验三二叉排序树的建立与查找#include<stdlib.h>

#include<stdio.h>

#defineNULL0

typedefintKeyType;

typedefstruct{

KeyTypekey;

}ElemType;//元素类型

typedefstructBiTNode{

ElemTypedata;

structBiTNode*lchild,*rchild;

}BiTNode,*BiTree;BiTreefind(BiTreeroot,KeyTypekey){//在二叉排序树中查找其关键字等于给定值的结点是否存在,并输出相应信息

BiTNode*p;

p=root;

if(p==NULL)returnNULL;

elseif(p->data.key==key)returnp;

elseif(key<p->data.key)returnfind(p->lchild,key);

elsereturnfind(p->rchild,key);

}

voidInsert(BiTree*p,BiTreet){//在二叉排序树中插入一个新结点

if(*p==NULL)*p=t;

elseif(t->data.key<(*p)->data.key)Insert(&((*p)->lchild),t);

elseif(t->data.key>(*p)->data.key)Insert(&((*p)->rchild),t);

}

voidinorder(BiTreep){//中序遍历所建二叉排序树,将得到一个按关键字有序的元素序列

if(p!=NULL){

inorder(p->lchild);

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

inorder(p->rchild);

}

}

voidmain(){

charch;

KeyTypekey;

BiTreep,s;

inti=0;

printf("Pleaseinputdatas(9999:end):\n");//建立一棵二叉排序树,元素值从键盘输入,直到输入关键字等于9999为止

scanf("%4d",&key);

p=NULL;

while(key!=9999){

s=(BiTree)malloc(sizeof(BiTNode));

(s->data).key=key;

s->lchild=s->rchild=NULL;

Insert(&p,s);

scanf("%d",&key);

}

printf("Createiscompleted\n");

inorder(p);//中序遍历已建立的二叉排序树

printf("\n");

do{//二叉排序树的查找,可多次查找,并输出查找的结果

printf("Inputthekeyyouwanttosearch:");

scanf("%4d",&key);

s=find(p,key);

if(s!=NULL)printf("success,thevalueis%4d",s->data.key);

elseprintf("unsuccess");

printf("\ncontinue?y:n\n");getchar();

ch=getchar();

}while(ch=='y'||ch=='Y');

}

运行结果:

Pleaseinputdatas(9999:end):

0654578521235468795842139999

Createiscompleted

012354546526578213584879

Inputthekeyyouwanttosearch:0

success,thevalueis0

continue?y:n

y

Inputthekeyyouwanttosearch:65

success,thevalueis65

continue?y:n

y

Inputthekeyyouwanttosearch:66

unsuccess

continue?y:n

n

Pressanykeytocontinue实验四windows操作系统与应用注册表的的备份和恢复:首先用下列方法将注册表备份到C盘根目录下,并命名为MyregiestBack。然后打开注册表,细致观察注册表的结构以与存放的内容,做好观察记录。最后恢复备份的注册表。①用注册表编辑器导出和引入注册表文件②用Regedt32导出和导入注册表③在MS-DOS命令行模式下导出和导入注册表文件④使用注册表检查器备份/恢复注册表⑤使用MSBackup工具备份/恢复Windows98/Me/NT/2000/XP注册表清理、优化注册表注册表中存放了大量信息,经过长时间的使用以后,其中有些表项是多余的,所以只有清理和优化注册表才能保证系统高速稳定地运行。可以用下列方法清理、优化注册表:①重新生成整个注册表,重新建立的注册表文件往往比原来的要小很多,从而达到优化注册表的目的。②删除“开始”菜单中“运行”的程序执行记录、系统打开各类文件的历史记录、一些常用软件各自的文件打开记录以与一些多余的窗口配色方案等。这样一类的东西都是可有可无的,删除它们并不会对系统运行造成多大的影响。③删除存储在HKEY_LASSROOT键下一些失效的关联文件。④删除HKEY_LOCAL_MACHINE\software、HKEY_CURRENT_USER\software和HKEY_USERS\.DEFAULT\software键下一些已卸载的残留键值。⑤删除一些无用的DLL等文件。⑥借助注册表清理软件来清理、优化注册表六大根键的作用

在注册表中,所有的数据都是通过一种树状结构以键和子键的方式组织起来,十分类似于目录结构。每个键都包含了一组特定的信息,每个键的键名都是和它所包含的信息相关的。如果这个键包含子键,则在注册表编辑器窗口中代表这个键的文件夹的左边将有“+”符号,以表示在这个文件夹中有更多的内容。如果这个文件夹被用户打开了,那么这个“+”就会变成“-”。

1.HKEY_USERS该根键保存了存放在本地计算机口令列表中的用户标识和密码列表。每个用户的预配置信息都存储在HKEY_USERS根键中。HKEY_USERS是远程计算机中访问的根键之一。

2.HKEY_CURRENT_USER该根键包含本地工作站中存放的当前登录的用户信息,包括用户登录用户名和暂存的密码(注:此密码在输入时是隐藏的)。用户登录Windows98时,其信息从HKEY_USERS中相应的项拷贝到HKEY_CURRENT_USER中。

3.HKEY_CURRENT_CONFIG

该根键存放着定义当前用户桌面配置(如显示器等)的数据,最后使用的文档列表(MRU)和其他有关当前用户的Windows98中文版的安装的信息。

4.HKEY_CLASSES_ROOT

根据在Windows98中文版中安装的应用程序的扩展名,该根键指明其文件类型的名称。

在第一次安装Windows98中文版时,RTF(RichTextformat)文件与写字板(WordPad)&127;联系起来,但在以后安装了中文Word6.0后,双击一个RTF文件时,将自动激活Word。存放在SYSTEM.DAT中的HKEY_CLASSES_ROOT,将替代WIN.INI文件中的[Extensions]&127;小节中的设置项,它把应用程序与文件扩展联系起来,它也替代了Windows3.x中的Reg.dat文件中的相似的设置项。

5.HKEY_LOCAL_MACHINE

该根键存放本地计算机硬件数据,此根键下的子关键字包括在SYSTEM.DAT中,用来提供HKEY_LOCAL_MACHINE所需的信息,或者在远程计算机中可访问

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论