f34(p->lchild); return count;
}
15. 有一带表头结点的单链表,其结点的data域的类型为字符型,编写一个算法删除该链表中的数字字符。
【答案】
void Del_digit (LNode *h){
for(p=h;p->next;){
q=p->next;
if(q->data>=’0’&& q->data <=’9’)
{p->next=q->next; free(q); }
else p=q;
}
}
16. 利用栈的基本运算,编写一个算法,实现将整数转换成二进制数输出。
【答案】
void returnDtoO(int num)
{
initStack(s);
while(n)
{ k=n%2;
n=n/2;
push(s,k);
}
while(EmptyStack(s))
{ pop(s,k);
printf(“%d”,k);
}
}
17. 设二叉树T采用二叉链表结构存储,数据元素为int型,试设计一个算法,若结点左孩子的data域的值大于右孩子的data域的值,则交换其左、右子树。
【答案】
void algo2(bitreptr bt){
bitreptr x;
if (bt){
if ((bt->lchild && bt->rchild) && (bt->lchild ->data> bt->rchild->data) ) {
x= bt->lchild ;
bt->lchild= bt->rchild;
bt->rchild=x;
}
algo2(bt->lchild);
algo2(bt->rchild);
}
}
18. 设二叉树T采用二叉链表结构存储,试设计算法求出二叉树的深度。
【答案】
int Deep(BTNode *bt){
if (bt==NULL) return 0;
left=Deep(bt->lchild);
right=Deep(bt->rchild);
return (left>right?left:right)+1;
}
19. 设给定的哈希表存储空间为H(0~M-1),哈希函数的构造方法为“除留余数法”,处理冲突的方法为“线性探测法”,设计算法将元素e填入到哈希表中。
【答案】
void hash-insert(hashTable h[],int m,ElemType e){
j=e%p;
if(h[j]!=NULL) h[j]=e;
else{
do
{ j=(j+1) %m;
}while(h[j]!=NULL );
h[j]=e;
}
}
20. 对于给定的十进制正整数,打印出对应的八进制正整数。(利用栈)
【答案】
void DecToOct(int num)
{
initStack(s); //初始化栈
while(n)
{ k=n%8;
n=n/8;
push(s,k);
}
while(EmptyStack(s)) //判断栈是否为空
{ pop(s,k);
printf(“%d”,k);
}
}
21. 一个正读和反读都相同的字符序列称为“回文”。例如“abcba”和“1221”是回文,而“abcde”不是回文。试写一个算法,要求利用栈的基本运算识别一个以@为结束符的字符序列是否是回文。
【答案】
int Pair(char *str ) {
InitStack(s);
p=str
for ( ; *p!=’@’; p++ )
Push(s,*p);
while(StackEmpty(s)) {
Pop(s,y);
if(y!=*str++ ) return 0;
}
return 1;
}
22. 有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法删除该链表中多余的元素值相同的结点(值相同的结点只保留一个)。
【答案】
void Delsame (LNode *h){
if(h->next) {
for(p=h->next;p->next;){
q=p->next;
if(p->data==q->data){
p->next=q->next;
free(q);
}
else p=q;
}
}
23. 编写一个算法,判断带表头结点的单链表是否递增有序。
【答案】
int fun(LNode *h )
{ p=h->next;
while(p->next)
{ q=p->next ;
if(q->data>p->data) return 0;
p=q;
}
return 1;
}
24. 假设有两个带表头结点的单链表HA和HB,设计算法将单链表HB插入到单链表HA的第i(0【答案】
void fun(LNode *ha, LNode *hb,int i)
{ for(p=hb;p->next; p=p->next);
for(j=1,q=ha;j q=q->next; ;
p->next=q->next;
q->next= hb->next ;
free(hb);
}
25. 假设以带头结点的单链表表示有序表,单链表的类型定义如下:
typedef struct node{
DataType data;
struct node *next
}LinkNode, *LinkList;
编写算法,从有序表A中删除所有和有序表B中元素相同的结点。
【答案】
(空)
26. 设二叉树T采用二叉链表结构存储,数据元素为字符类型。设计算法分别求出二叉链表中data域为英文字母和数字字符的
结点个数。
【答案】
int letter=0,digit=0; /*全局变量*/
void algo2(BTNode *bt){
if (bt){
if(bt->data>=’A’&& bt->data<=’Z’|| bt->data>=’a’&& bt->data<=’z’) letter ++;
if(bt->data>=’0’&& bt->data<=’9’) digit ++;
algo2(bt->lchild);
algo2(bt->rchild);
}
}
27. 假设以单链表表示线性表,单链表的类型定义如下:
typedef struct node {
DataType data;
struct node *next;
} LinkNode, *LinkList;
编写算法,将一个头指针为head且不带头结点的单链表改造为一个含头结点且头指针仍为head的单向循环链表,并分析算法的时间复杂度。
【答案】
LinkList f34(LinkList head)
{
LinkList p,s;
p=head;
while (p->next) p=p->next;
s=(LinkList)malloc(sizeof(LinkNode));
s->next=head;
p->next=s;
head=s;
return head;
}
时间复杂度为:O(n)
28. 假设有向图以邻接表方式存储,编写一个算法判别顶点vi到顶点vj是否存在弧。
【答案】
int IsArcs(ALgraph G,int i,int j) {
/* 判断有向图G中顶点i到顶点j是否有弧,是则返回1,否则返回0*/
p=G[i].firstarc;
while (p!=NULL) {
if(p->adjvex ==j)
return 1;
p=p->nextarc;
}
return 0;
}
29. 设二叉树T采用二叉链表结构存储,数据元素为字符类型。设计算法求出二叉链表中data域为大写字母的结点个数。
【答案】
int count=0;/* count为全局变量*/
void algo2(BTNode *bt){
if (bt){
if(bt->data>=’A’&& bt->data<=’Z’)
count++;
algo2(bt->lchild);
algo2(bt->rchild);
}
}
30. 假设带表头结点的双向循环链表定义如下:
typedef struct dunode{
char data;
struct dunode *prior, *next;
}DuNode;
现用该链表存放字符串,编写一个算法,判断该字符串是否中心对称关系。例如字符串“xyzzyx”和“xyzyx” 都是中心对称的。
【答案】
int fun(DuNode *h )
{ p=h->next;q=h->prior;
while(p!=q && p->prior!=q)
{
if(q->data==p->data)
{ p=p->next;q=q->prior;}
else return 0;
}
return 1;
}
31. 假设以带头结点的单链表表示线性表,单链表的类型定义如下:
typedef int DataType;
typedef struct node {
DataType data;
struct node * next;
} LinkNode, * LinkList;
编写算法,删除线性表中最大元素(假设最大值唯一存在)。函数原型为:
void f34(LinkList head) ;
【答案】
void f34(LinkList head)
{
int e;
LinkList p,q,s,spre; //s指向最大值的那个结点
spre=head; s=head->next;
q=s; p=s->next;
while (p)
{
if(s->datadata) { s=p; spre=q; }
q=p;
p=p->next;
}
e=s->data;
spre->next=s->next;
free(s);
}