}
cout<<"\n\n\nPressanykeytoExit.";
getch();
}
样题7 设在一个带表头结点的单链表中所有元素结点的数据值按递增顺序排列,请编写一个函数,删除表中所有大于min,小于max的元素(若存在),并编写主程序验证该函数的正确性。
//J7.CPP
#include"stdio.h"
#include"conio.h"
#include"malloc.h"
typedefstructnode{
chardata;
structnode*next;
}ListNode;
typedefListNode*LinkList;
LinkListCreateListR(void)//WithHeadNode
{
charch;
LinkListhead=(LinkList)malloc(sizeof(ListNode));
ListNode*s,*r;
r=head;
while((ch=getchar())!
='\n'){
s=(ListNode*)malloc(sizeof(ListNode));
s->data=ch;
r->next=s;
r=s;
}
r->next=NULL;
returnhead;
}
voidDeleteNode(LinkListhead,charmin,charmax)
{
ListNode*p,*s;
p=head;s=NULL;
while(p->next){
if(p->next->data>min)break;
p=p->next;
}
if(!
p->next)return;
s=p;
while(p->next){
if(p->next->data>=max)break;
p=p->next;
}
if(!
p->next)s->next=NULL;
elses->next=p->next;
}
voidmain()
{
char*hold;
charmin,max;
LinkListhead,s;
clrscr();
printf("InputchartobuildListNode(Min->Max):
\n");
head=CreateListR();
printf("\nListNodeelementandelementdatavalue:
\n");
s=head;
while(s->next){
s=s->next;
printf("%2c",s->data);
}
s=head;
printf("\n\nInputcharmin&max(separator\"\"):
");
scanf("%c%c",&min,&max);
DeleteNode(head,min,max);
printf("\nListNode(%c\n",min,max);
s=head;
while(s->next){
s=s->next;
printf("%2c",s->data);
}
printf("\n\n\n");
printf("EntertoExit.");
gets(hold);
gets(hold);
}
样题8 所谓回文,是指从前向后顺读和从后向前倒读都一样的不含空白字符的串,例如did,madamimadam,pop即是回文。
请编写一个递归程序,以差数一个串是否是回文。
算法的声明为intpal(charA[],ints,intc)。
pal判断从s到e中的字符串是否回文,通过函数返回是
(1)或不是(0)。
#include"stdio.h"
#include"conio.h"
#defineMaxSize100
intpal(charA[],ints,inte)
{
inti;
if(s>=e)return1;
elsereturn(A[s]==A[e])&&pal(A,++s,--e);
}
voidmain()
{
char*hold;
charA[MaxSize],B[MaxSize];
ints,e,t,i,j;
clrscr();
printf("\nPleaseInputpalindrometestStringA:
");
gets(A);
printf("\nPleaseInputstartplace(integer):
");
scanf("%d",&s);
printf("\nPleaseInputendplace(integer):
");
scanf("%d",&e);
if(s>e){j=s;s=e;e=j;}
t=pal(A,s-1,e-1);
i=0;
for(j=s-1;jif(t)printf("\nThisisapalindrome:
%s",B);
elseprintf("\nThisisnotapalindrome:
%s",B);
printf("\n\n\n");
printf("EntertoExit.");
gets(hold);
gets(hold);
}
样题9 已知二叉树中的结点类型用BinTreeNode表示,被定义为:
strectBinTreeNode{chardata;BintreeNodeleftChild,rightChild;};其中data为结点值域,leftChild和right和分别为指向左、右子女结点的指针域,根据下面函数声明编写出来一棵二叉树高度的函数代码,并编写主程序验证,该高度由函数返回。
假定极结点的层次为0,参数BT初始指向这棵二叉树的极结点。
IntBtreeHeight(BintreeNode*BT);
//创建二叉树->装入数据->求树高->遍历显示->销毁递归实现
#include"conio.h"
#include"stdio.h"
#include"iostream.h"
typedefcharDataType;
typedefstructBinTreeNode//树的数据结构
{
DataTypedata;
structBinTreeNode*LeftChild,*RightChild;
}BinTreeNode;
//初始化为空树
BinTreeNode*Initiate()
{
BinTreeNode*root=0;
returnroot;
}
//建节点
BinTreeNode*Creat(DataTypedata)
{
BinTreeNode*Temp=newBinTreeNode;
Temp->data=data;
Temp->LeftChild=0;
Temp->RightChild=0;
returnTemp;
}
//输入数据为BST(二叉排序树)的先根序列
voidInsert(BinTreeNode*&root,DataTypedata)//在c下不能这样Node*&root
{
BinTreeNode*p=Creat(data);
if(!
root){
root=p;
}
elseif(p->datadata){
Insert(root->LeftChild,p->data);
}else{
Insert(root->RightChild,p->data);
}//相等的就将数据装到右孩子
}
//测试BINTREE的高度
intBTreeHeight(structBinTreeNode*BT)
{
inth1,h2;
if(!
BT)return0;
else{
h1=BTreeHeight(BT->LeftChild);
h2=BTreeHeight(BT->RightChild);
if(h1>h2)returnh1+1;
elsereturnh2+1;
}
}
//递归中序遍历,显示从小到大
voidPrintTree(BinTreeNode*root)
{
if(!
root)return;
PrintTree(root->LeftChild);
cout<data<<"";
PrintTree(root->RightChild);
return;
}
//释放BINTREE占用的内存空间
voidFreeTree(BinTreeNode*root)
{
if(!
root)retur