河南科技大学计算机软件技术基础实验指导书及参考代码.docx

上传人:b****5 文档编号:11854432 上传时间:2023-04-06 格式:DOCX 页数:23 大小:38.65KB
下载 相关 举报
河南科技大学计算机软件技术基础实验指导书及参考代码.docx_第1页
第1页 / 共23页
河南科技大学计算机软件技术基础实验指导书及参考代码.docx_第2页
第2页 / 共23页
河南科技大学计算机软件技术基础实验指导书及参考代码.docx_第3页
第3页 / 共23页
河南科技大学计算机软件技术基础实验指导书及参考代码.docx_第4页
第4页 / 共23页
河南科技大学计算机软件技术基础实验指导书及参考代码.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

河南科技大学计算机软件技术基础实验指导书及参考代码.docx

《河南科技大学计算机软件技术基础实验指导书及参考代码.docx》由会员分享,可在线阅读,更多相关《河南科技大学计算机软件技术基础实验指导书及参考代码.docx(23页珍藏版)》请在冰豆网上搜索。

河南科技大学计算机软件技术基础实验指导书及参考代码.docx

河南科技大学计算机软件技术基础实验指导书及参考代码

目录

实验一单链表的运算2

实验二二叉树的建立和遍历5

实验三二叉排序树的建立和查找6

实验四windows操作系统及应用9

实验五数据库建立10

实验六数据库查询12

附录13

 

实验一单链表的运算

一、实验目的

1.掌握单链表的基本运算:

建立、插入和删除

2.掌握运用C语言上机调试单链表的基本方法。

二、实验环境

操作系统和C语言系统

三、预习要求

了解单链表的建立、插入和删除算法,编写完整的程序。

四、实验内容

设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。

具体实现要求:

(1)从键盘输入n个整数,以0作为结束标记,产生不带表头的单链表,并输入结点值。

(2)从键盘输入1个整数,在单链表中查找该结点的位置。

若找到,则显示“找到了”;否则显示“找不到”。

(3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。

(4)从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。

五、参考算法

#include

#include

/*单链表的定义*/

typedefintDataType;/*DataType可以是任何相应的数据类型如int,float或char*/

typedefstructnode/*结点类型定义*/

{DataTypedata;/*结点的数据域*/

structnode*next;/*结点的指针域*/

}ListNode;

typedefListNode*LinkList;

voidmain()

{inti;

DataTypekey,x;

LinkListhead;

ListNode*p;

LinkListCreateList(void);

voidPrintList(LinkListhead);

LinkListLocateNode(LinkListhead,DataTypekey);

LinkListGetNode(LinkListhead,inti);

voidInsertList(LinkList*head,DataTypex,inti);

voidDeleteList(LinkList*head,inti);

//clrscr();

head=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);/*打印单链表*/

}

/*单链表的建立,从后向前生成*/

LinkListCreateList(void)

{

LinkListhead,p;

intx;

head=NULL;

printf("inputsomeinteagersuntil0!

");

scanf("%d",&x);

while(x)

{p=(LinkList)malloc(sizeof(ListNode));/*以下三行:

新建结点并初始化*/

p->data=x;

p->next=NULL;

if(head==NULL)head=p;

else{p->next=head;head=p;}

scanf("%d",&x);

}

return(head);

}

/*单链表的打印*/

voidPrintList(LinkListhead)

{

LinkListp;

p=head;

while(p!

=NULL)

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

p=p->next;

}

}

/*单链表的查找,输入一个整数,显示该结点的位置*/

LinkListLocateNode(LinkListhead,DataTypekey)

{/*在不带头结点的单链表head中查找其值为key的结点*/

LinkListp;

if(head==NULL){printf("Listisnull!

");return(head);}

if(head->data==key){printf("thewanteddatais:

%d",head->data);return(head);}

p=head;

while((p->data!

=key)&&((p==NULL))

p=p->next;

if(p!

=NULL)printf("thewanteddatais:

%d",p->data);

elseprintf("thewanteddataisnotfound!

");

return(p);

}

/*单链表的查找2,在不带头结点的单链表head中查找第i个结点*/

LinkListGetNode(LinkListhead,inti)

{

LinkListp;

intn=1;

p=head;

while((p!

=NULL)&&(n

{if(nnext;}}

return(p);

}

/*单链表的插入*/

voidInsertList(LinkList*head,DataTypex,inti)

{/*将值为x的新结点插入到不带头结点的单链表head的第i个结点的位置上*/

LinkListp,q;

p=(LinkList)malloc(sizeof(ListNode));/*以下三行:

新建结点并初始化*/

p->data=x;

p->next=NULL;

if(i<=1)/*在第一个位置插入*/

{p->next=*head;*head=p;}

else/*找到要插入的前一个位置,然后插入*/

{q=GetNode(*head,i-1);

p-next=q->next;

q->next=p;

}

}

/*单链表的删除,删除不带头结点的单链表中的第i个结点*/

voidDeleteList(LinkList*head,inti)

{

LinkListp,q;

if((i<=0)||(*head=NULL)){printf("Listisnullori<=0!

");return;}

if(i==1){p=((*head)->next);free(*head);*head=p;return;}

p=*head;

while((p!

=NULL)&&(--i>0))

{q=p;p=p->next;}

if(p==NULL)printf("i>L!

");

else

{q->next=p->next;free(p);}

}

实验二二叉树的建立和遍历

一、实验目的

1.掌握二叉树的建立算法

2.掌握二叉树的前序、中序和后序遍历算法。

二、实验环境

操作系统和C语言系统

三、预习要求

复习二叉树的生成及遍历算法,编写完整的程序。

四、实验内容

要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。

具体实现要求:

分别利用前序遍历、中序遍历、后序遍历所建二叉树。

五、参考算法

二叉树的建立算法思路:

主要利用二叉树的性质:

在编号的完全二叉树中,编号为i的结点如果存在左孩子,则其编号为2i;若其存在右孩子,则其编号为2i+1;若存在父结点,则其编号为i/2取整。

对任意二叉树,先按满二叉树对其进行编号,算法中使用一个辅助向量s来存放指向树结点的指针。

如s[i]中存放编号为i的结点的指针,即为该结点的地址。

当结点编号i=1时,所产生的结点为根结点,同时将指向该结点的指针存入s[1]。

当结点编号i>1时,产生一个新的结点后,也要将指向该结点的指针存入s[i],由上述性质可知:

j=i/2为它的双亲结点编号。

如果i为偶数,则它是双亲结点的左孩子,即让s[j]->lch=s[i];若i为奇数,则它是双亲结点的右孩子,即让s[j]->rch=s[i]。

这样就将新输入的结点逐一与其双亲结点相连,生成二叉树。

二叉树的遍历算法可以使用递归算法实现,也可采用非递归算法实现,可参考教材上算法实现。

#include

#include

#include

/*二叉树的定义*/

typedefcharDataType;/*DataType可以是任何相应的数据类型如int,float或char*/

typedefstructbtnode/*结点类型定义*/

{

DataTypedata;/*结点的数据域*/

structbtnode*lchild;/*结点的左指针域*/

structbtnode*rchild;/*结点的右指针域*/

}BtNode;

voidmain()

{

DataTypech[20];

BtNode*s[20],*bt,*p;

inti=0;

/*以下三行按照前中后序遍历二叉树的函数声明*/

voidpretrav(BtNode*bt);

voidintrav(BtNode*bt);

voidpostrav(BtNode*bt);

/*按满二叉树编号后的顺序输入结点字符,空的位置用'#'代替,字符个数不要超过20个*/

printf("\ninputsomecharacters:

");

scanf("%s",ch);/*输入结点字符*/

for(i=0;i<20;i++)

{

if(ch[i]=='\0')

break;/*如果输入的是结束符*/

p=(BtNode*)malloc(sizeof(BtNode));/*创建一个树结点,由p指针指向,以下三行初始化新结点*/

p->data=ch[i];

p->lchild=NULL;

p->rchild=NULL;

s[i]=p;

if(ch[i]=='#')

continue;/*如果输入的是'#',即该位置没有结点,无需找其父节点*/

if(i>0)

{

if(i%2==1)

s[i/2]->lchild=p;/*根据i的奇偶性,将p结点链到其父节点的(左/右?

)指针上*/

elses[i/2-1]->rchild=p;

}/*将p结点链到其父节点的(左/右?

)指针上*/

}

for(i=0;i<20&&ch[i]!

='\0';i++)/*依次输出各结点及其孩子*/

{

if(ch[i]=='#')

continue;

if(s[i]->lchild!

=NULL&&s[i]->rchild!

=NULL)

printf("%c,%c,%c\n",s[i]->data,s[i]->lchild->data,s[i]->rchild->data);

elseif(s[i]->lchild!

=NULL)

printf("%c,%c,%c\'srchildisNULL!

\n",s[i]->data,s[i]->lchild->data,s[i]->data);

elseif(s[i]->rchild!

=NULL)

printf("%c,%c\'slchildisNULL!

%c\n",s[i]->data,s[i]->data,s[i]->rchild->data);

else

printf("%c,%c\isaleaf!

\n",s[i]->data,s[i]->data);

}

/*以下按照前中后序遍历二叉树*/

printf("\npretrav!

");

pretrav(s[20]);

printf("\nintrav!

");

intrav(s[20]);

printf("\npostrav!

");

postrav(s[20]);

printf("\n");

while

(1);

}

/*前序遍历二叉树*/

voidpretrav(BtNode*bt)

{

BtNode*p;

p=bt;

if(p!

=NULL)

{

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

pretrav(bt->lchild);

pretrav(bt->rchild);

}

return;

}

/*中序遍历二叉树*/

voidintrav(BtNode*bt)

{

if(bt!

=NULL)

{

intrav(bt->lchild);

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

intrav(bt->rchild);

}

return;

}

/*后序遍历二叉树*/

voidpostrav(BtNode*bt)

{

if(bt!

=NULL)

{

postrav(bt->lchild);

postrav(bt->rchild);

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

}

return;

}

实验三二叉排序树的建立和查找

一、实验目的

1.掌握二叉排序树的建立算法

2.掌握二叉排序树查找算法。

二、实验环境

操作系统和C语言系统

三、预习要求

复习二叉排序树的生成及查找算法,编写完整的程序。

四、实验内容

实现二叉排序树上的查找算法。

具体实现要求:

用二叉链表做存储结构,输入键值序列,建立一棵二叉排序树并在二叉排序树上实现查找算法。

五、参考算法

#include

#include

typedefintInfoType;

typedefintKeyType;/*假定关键字类型为整数*/

typedefstructnode/*结点类型*/

{

KeyTypekey;/*关键字项*/

InfoTypeotherinfo;/*其它数据域,InfoType视应用情况而定下面不处理它*/

structnode*lchild,*rchild;/*左右孩子指针*/

}BSTNode;

typedefBSTNode*BSTree;/*BSTree是二叉排序树的类型*/

voidmain()

{

BSTNode*SearchBST(BSTreeT,KeyTypekey);

voidInsertBST(BSTree*Tptr,KeyTypekey);

BSTreeCreateBST(void);

voidListBinTree(BSTreeT);/*用广义表表示二叉树*/

BSTreeT;

BSTNode*p;

intkey;

printf("请输入关键字(输入0为结束标志):

\n");

T=CreateBST();

ListBinTree(T);

printf("\n");

printf("请输入欲查找关键字:

");

scanf("%d",&key);

p=SearchBST(T,key);

if(p==NULL)

printf("没有找到%d!

\n",key);

else

printf("找到%d!

\n",key);

ListBinTree(p);

printf("\n");

}

BSTNode*SearchBST(BSTreeT,KeyTypekey)

{/*在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NULL*/

if(T==NULL||key==T->key)/*递归的终结条件*/

returnT;/*若T为空,查找失败;否则成功,返回找到的结点位置*/

if(keykey)

returnSearchBST(T->lchild,key);

else

returnSearchBST(T->rchild,key);/*继续在右子树中查找*/

}

voidInsertBST(BSTree*Tptr,KeyTypekey)

{/*若二叉排序树*Tptr中没有关键字为key,则插入,否则直接返回*/

BSTNode*f,*p=*Tptr;/*p的初值指向根结点*/

while(p){/*查找插入位置*/

if(p->key==key)return;/*树中已有key,无须插入*/

f=p;/*f保存当前查找的结点*/

p=(keykey)?

p->lchild:

p->rchild;

/*若keykey,则在左子树中查找,否则在右子树中查找*/

}

p=(BSTNode*)malloc(sizeof(BSTNode));

p->key=key;p->lchild=p->rchild=NULL;/*生成新结点*/

if(*Tptr==NULL)/*原树为空*/

*Tptr=p;/*新插入的结点为新的根*/

else/*原树非空时将新结点*p作为*f的左孩子或右孩子插入*/

if(keykey)

f->lchild=p;

elsef->rchild=p;

}

BSTreeCreateBST(void)

{/*输入一个结点序列,建立一棵二叉排序树,将根结点指针返回*/

BSTreeT=NULL;/*初始时T为空树*/

KeyTypekey;

scanf("%d",&key);/*读入一个关键字*/

while(key){/*假设key=0是输入结束标志*/

InsertBST(&T,key);/*将key插入二叉排序树T*/

scanf("%d",&key);/*读入下一关键字*/

}

returnT;/*返回建立的二叉排序树的根指针*/

}

六、思考题

请思考采用其他存储结构实现的二叉排序树建立算法。

七、实验报告要求

具体内容包含以下几项:

实验题目、实验目的、实验环境、实验内容与完成情况(要求附上自主设计的源程序)、实验中出现的问题、对问题的解决方案、完成思考题、实验总结等。

实验五数据库建立

一、实验目的

1.熟练掌握用SQL语句实现基本表的创建。

2.熟练掌握用SQL语句实现数据插入、数据更新和数据查询。

3.熟练掌握用SQL语句实现数据的简单查询和连接查询。

二、实验环境

SQLServer2000

三、预习要求

SQLServer2000的查询分析器和企业管理器的使用,SQL数据定义和数据操纵语言。

四、实验内容

(一)用SQL语句建立如下mySPJ数据库,包括S,P,J,和SPJ四个基本表(四张表的数据另给),要求实现关系的三类完整性。

S(SNO,SNAME,STATUS,CITY);

P(PNO,PNAME,COLOR,WEIGHT);

J(JNO,JNAME,CITY);

SPJ(SNO,PNO,JNO,QTY)

供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成。

零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成。

工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。

供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,表示某供应商供应某种零件给某工程项目的数量为QTY。

(二)分别使用插入、删除、修改的方式更新基本表中的数据。

五、实验方法和步骤

(一)使用MicrosoftSQLServer企业管理器和查询分析器建立数据库mySPJ:

1.打开“开始->程序->MicrosoftSQLServer->企业管理器”;

2.在企业管理器左边的树标签中依次打开“MicrosoftSQLServer->SQLServer组->(local)(WindowsNT)->数据库”,(local)(WindowsNT)前的红色标记转化为绿色标记表明NT服务已启动;

3.从企业管理器的“工具”菜单中选择“SQL查询分析器”,打开查询分析器后,在其窗口书写创建数据库mySPJ的SQL语句,点击执行按钮(或F5键)执行该SQL语句;

4.在企业管理器左边的树标签中查看数据库是否建立成功。

(二)在数据库mySPJ中建立S,P,J,和SPJ四个基本表:

按照实验内容给出的基本表结构在查询分析器窗口中书写SQL语句分别建立各表,并设置主键和外键约束;

(三)更新表数据:

1.利用Insert语句将习题中给出的示例记录插入各表。

2.利用Update更新表中的记录:

①将p表中的所有红色零件的重量增加5。

updatep

setweight=weight+5

wherecolor='红';

②将spj表中所有天津供应商的QTY属性值减少10。

用子查询。

updatespj

setqty=qty-10

wheresnoin//不能用sno=因为返回值多于一个...

(selectsno

froms

wherecity='天津');

3.利用Delete语句删除p表中的所有红色零件的记录。

delete

fromp

wherecolor='红';

实验六数据库查询

(一)完成下面的简单查询:

①查询所有“天津”的供应商明细;

select*

froms

wherecity='天津';

②查询所有“红色”的14公斤以上的零件。

selectpname

fromp

wherecolor='红'andweight>14;

③查询工程名称中含有“厂”字的工程明细。

selectjno,jname,city

fromj

wherejnamelike'%厂%';

(二)完成下面的连接查询:

①等值连接:

求s表和j表的相同城

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1