/*以上循环语句的功能是依次输出顺序表中的元素*/
printf("\n");
}
三、实验要求
编写出能正确运行且具有相应功能的源程序,撰写实验报告。
实验二线性表
(二)
一、实验目的
1.掌握线性表的建立、插入、删除、打印和查找操作在链式存储结构上的实现。
二、实验内容
线性表的建立、插入、删除、打印和查找操作在链式存储结构上的实现。
其中函数CreateList_L的功能是利用从尾部插入的方法建立一个带头结点,有n个元素结点的单链表,函数PrintList_L的功能是从单链表的头部开始顺序打印单链表,函数ListInsert_L的功能是在单链表的位置i之前插入一个值为e的新结点,函数LIstDelete_L的功能是在单链表中删除值为e的结点。
#include
#include
#include
#defineOK1
#defineERROR0
typedefintStatus;
//定义链表的存储结构,实际上是链表中每个结点的存储结构
typedefintElemType;
typedefstructLNode{
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
voidCreateList_L(LinkList&L,intn)//建有n个元素结点的带头结点单链表,可以用头插法或尾插法
{
}
voidPrintList_L(LinkListL)//依次输出带头结点单链表中的所有元素
{
}
StatusListInsert_L(LinkList&L,inti,ElemTypee)//在单链表的第i位置插入一个元素e
{
}
StatusListDelete_L(LinkList&L,ElemTypee)//删除单链表第i位置的结点,将元素存进e
{
}
voidmain()
{
LinkListL;
ElemTypey;
intn;
printf("输入单链表进需存进的元素数量!
\n");
scanf("%d",&n);
while(n<1||n>10)
{
printf("请输入1--10之间的整数!
\n");
scanf("%d",&n);
}
/*以上循环语句的功能是控制输入数据个数的合法性,可以修改*/
printf(“依次输入存进单链表中的数据元素:
\n”);
CreateList_L(L,n);
printf(“单链表中的数据元素为:
\n”);PrintList_L(L);
printf(“请输入插入元素的位置:
\n”);scanf(“%d”,&n);
printf(“请输入插入元素的值:
\n”);scanf(“%d”,&y);
ListInsert_L(L,n,y);
printf(“单链表中的数据元素为:
\n”);PrintList_L(L);
printf(“请输入删除元素的值:
\n”);scanf(“%d”,&y);
ListDelete_L(L,y);
printf(“单链表中的数据元素为:
\n”);PrintList_L(L);
}
三、实验要求
编写出能正确运行且具有相应功能的源程序,撰写实验报告。
实验三线性表(三)
一、实验目的
1.理解一元多项式的求和操作在链式存储结构上的实现。
二、实验内容
一元多项式的求和操作在链式存储结构上的实现。
其中函数CreatePolyn是利用从尾部插入结点的方法建立链式结构表示一元多项式,函数createitem的功能是生成结果多项式中的一个结点并将之链接到结果多项式链表中,函数PrintPolyn的功能是从单链表头部开始顺序打印单链表中的结点元素,函数AddPolyn的功能是计算两个一元多项式的和。
#include
#include
#include
#defineOVERFLOW-2
//单链表存储结构的定义
typedefstruct{//项的表示
floatcoef;//系数
intexpn;//指数
}ElemType;
typedefstructLNode{//结点的定义
ElemTypedata;
structLNode*next;
}LNode,*LinkList;
typedefLinkListpolynomial;
voidCreatePolyn(polynomial&P,intm)//存储多项式,即建单链表,可以采用尾插法或头插法
{
}
voidPrintPolyn(polynomialP)//输出多项式,注意多项式的显示格式
{
}
voidAddPolyn(polynomial&Pa,polynomial&Pb)//两个多项式相加,即两个单链表的合并处理
{
}
voidmain()
{
polynomialPa,Pb;
intn;
printf(“输入多项式A的项数:
\n”);scanf(“%d”,&n);
while(n<1||n>10)
{
printf("请输入1--10之间的整数!
\n");
scanf("%d",&n);
}
/*以上循环语句的功能是控制输入数据个数的合法性,可以修改*/
printf("请按指数从小到大的顺序依次输入多项式A各项的\n系数指数:
\n");
CreatePolyn(Pa,n);
printf(“多项式A为:
\n”);PrintPolyn(Pa);
printf(“输入多项式B的项数:
\n”);scanf(“%d”,&n);
while(n<1||n>10)
{
printf("请输入1--10之间的整数!
\n");
scanf("%d",&n);
}
/*以上循环语句的功能是控制输入数据个数的合法性,可以修改*/
printf("请按指数从小到大的顺序依次输入多项式B各项的\n系数指数:
\n");
CreatePolyn(Pb,n);
printf(“多项式B为:
\n”);PrintPolyn(Pb);
AddPolyn(Pa,Pb);
printf(“多项式A+B为:
\n”);PrintPolyn(Pa);
}
三、实验要求
编写出能正确运行且具有相应功能的源程序,撰写实验报告。
实验四栈和队列
一、实验目的
1.掌握栈的入栈和出栈操作在顺序存储结构上的实现,及其在实际问题中的应用。
二、实验内容
1.栈的入栈和出栈操作在顺序存储结构上的实现及其在具体问题中的应用:
简单行编辑程序。
其中函数InitStack的功能是初始化栈,函数ClearStack的功能是清空栈,DestroyStack的功能是销毁栈,函数Push的功能是实现入栈操作,函数Pop的功能是实现出栈操作,函数LineEdit的功能是进行简单的行编辑:
接收终端输入的数据,并存用户数据区,函数strCopy的功能是将栈中的所有字符存放进数据区。
#include
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintStatus;
//以栈的存储结构定义,用来存储从终端输入的每行数据
typedefcharSElemType;
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;
}SqStack;
//用来存储从栈中获取的每行数据,其中length表示当前字符串的长度,称为数据区。
#defineArraySize1000
typedefstruct{
charstr[ArraySize];
intlength;
}Destr;
Destrword;
StatusInitStack(SqStack&S)//初始化栈
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}
SElemTypeGetTop(SqStackS,SElemType&e)//获取栈顶元素
{
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returnOK;
}
StatusPush(SqStack&S,SElemTypee)//元素e入栈
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}
StatusPop(SqStack&S,SElemType&e)//出栈,元素存进e
{
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}
StatusClearStack(SqStack&S)//清空栈
{
S.top=S.base;
returnOK;
}
StatusDestroyStack(SqStack&S)//销毁栈
{
free(S.base);
S.base=S.top=NULL;
S.stacksize=0;
returnOK;
}
voidStrCopy(SqStack&S)//将栈中的元素依次存进数据区,注意栈顶的元素应存在最后
{
char*p;
inti;
word.length=word.length+S.top-S.base;
word.str[word.length]='\n';
for(p=S.top-1,i=word.length-1;p>=S.base;p--,i--)
word.str[i]=*p;
++word.length;
}
voidLineEdit()//行编辑程序
{
SqStackS;
SElemTypec,ch;
InitStack(S);
ch=getchar();
while(ch!
=EOF){
while(ch!
=EOF&&ch!
='\n'){
switch(ch){
case'#':
Pop(S,c);break;//仅当栈非空时退栈
case'@':
ClearStack(S);break;//重置S为空栈
default:
Push(S,ch);break;//有效字符进展,未考虑栈满情形
}
ch=getchar();
}
StrCopy(S);
ClearStack(S);
if(ch!
=EOF)ch=getchar();
}
DestroyStack(S);
}
voidmain()
{
inti;
printf("请输入内容,最后以结尾Ctrl+Z(注意:
新起一行输入)\n");
LineEdit();
printf("编辑后的内容为:
\n");
for(i=0;iputchar(word.str[i]);
}
三、实验要求
编写出能正确运行且具有相应功能的源程序,撰写实验报告。
实验五树
一、实验目的
1.掌握二叉树的前序遍历、中序遍历、后序遍历在链式存储结构上实现。
2.掌握利用遍历二叉树的递归思想实现建立二叉树、和求二叉树中叶子结点数目等算法。
二、实验内容
1.建立二叉树、遍历二叉树、统计二叉树中叶子结点数目操作运算在链式存储结构上实现。
其中函数CreateBiTree的功能是利用前序遍历二叉树的算法思想实现建立一棵二叉树,函数PreOrderTraverse、InOrferTraverse、PostOrderTraverse的功能分别是实现前序遍历、中序遍历、后序遍历,函数CountLeaf的功能是实现统计二叉树中叶子结点数目。
#include
#include
#defineOVERFLOW-2
#defineOK1
#defineERROR0
typedefintStatus;
//树的二叉存储结构定义-+a##*b##-c##d##/e##f##
typedefcharTElemType;
typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
StatusVisit(TElemTypee)//输出结点的数据元素
{
putchar(e);
returnOK;
}
StatusCreateBiTree(BiTree&T)//建树,可采用先序,中序或后序递归遍历方法建树
{
charch;
ch=getchar();
if(ch=='#')T=NULL;
else{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
returnOK;
}
StatusPreOrderTraverse(BiTree&T,Status(*Visit)(TElemTypee))//先序递归遍历树
{
if(T){
if(Visit(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))returnOK;
returnERROR;
}
elsereturnOK;
}
StatusInOrderTraverse(BiTree&T,Status(*Visit)(TElemTypee))//中序递归遍历树
{
if(T){
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit))returnOK;
returnERROR;
}
elsereturnOK;
}
StatusPostOrderTraverse(BiTree&T,Status(*Visit)(TElemTypee))//后序递归遍历树
{
if(T){
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if(Visit(T->data))returnOK;
returnERROR;
}
elsereturnOK;
}
voidCountLeaf(BiTree&T,int&count)//统计树的叶子结点数量
{
if(T){
if((!
T->lchild)&&(!
T->rchild))
count++;
else{
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
}
voidmain()
{
BiTreebt=0;intcount=0;
printf("建树:
请输入树的先序遍历序列,结点空子树用#表示。
\n");
CreateBiTree(bt);printf("\n");
printf("树的先序遍历序列为:
\n");
PreOrderTraverse(bt,Visit);printf("\n");
printf("树的中序遍历序列为:
\n");
InOrderTraverse(bt,Visit);printf("\n");
printf("树的后序遍历序列为:
\n");
PostOrderTraverse(bt,Visit);printf("\n");
CountLeaf(bt,count);printf("树的叶子结点=%d\n",count);
}
三、实验要求
编写出能正确运行且具有相应功能的源程序,撰写实验报告。
实验六查找
一、实验目标
1.掌握顺序表的查找算法在顺序存储结构上的实现。
二、实验内容
1.顺序表查找在顺序存储结构上的实现。
此顺序表中存放学生的相关信息:
学号和姓名。
关键是学号。
其中函数Init_ST的功能是实现顺序表的初始化,函数Create_ST的功能是建立顺序表,函数Search_Sq的功能是实现在顺序线性表中顺序查找关键字,函数Search_Bin的功能是实现在顺序线性表中折半查找关键字。
#include
#include
#include
#include
#defineOVERFLOW-2
#defineST_INIT_SIZE100
//静态查找表的顺序存储结构
typedefcharKeyType[14];
typedefstruct{
KeyTypekey;//学号
charname[10];//姓名
}ElemType;
typedefstruct{
ElemType*elem;
intlength;
}SSTable;
voidInit_ST(SSTable&ST)//初始化顺序表
{
}
voidCreate_ST(SSTable&ST)//建表,即将数据内容存在顺序表
{
}
intSearch_Sq(SSTableST,KeyTypekey)//顺序查找,若找到,则返回它在顺序表中的位置,若找不到,则返回0,
{
}
intSearch_Bin(SSTableST,KeyTypekey)//折半查找,若找到,则返回它在顺序表中的位置,若找不到,则返回0,
{
}
voidmain()
{
inti;
SSTableST;
KeyT