if(l->data[i]==item)returni;
printf(“找不到!
”);
return0;}
2、顺序表的插入算法
structnode
{intdata[20];
intlength;};
intins(structnode*l,inti,intx)
{intj;
if(i<1||i>l->length+1)return0;
for(j=l->length;j>=i;j--)
l->data[j]=l->data[j-1];
l->data[j-1]=x;
l->length++;
return1;
}
3、顺序表删除算法
structnode
{intdata[20];
intlength;};
intdel(structnode*l,inti;)
{intj;
if(i<1||i>l->length)return0;
for(j=i-1;jlength-2;j++)
l->data[j]=l->data[j+1];
l->length--;
return1;
}
4、单链表的定位算法
structnode
{intdata;
structnode*next;};
intloc(structnode*l,intitem)
{inti;
structnode*temp;
temp=l->next;
while(temp!
=NULL&&temp->data!
=item)
{i++;
temp=temp->next;}
if(temp==NULL)return0;
elsereturni;
}
5、单链表的插入算法(后插法)
structnode
{intdata;
structnode*next;};
intins(structnode*l,inti,intitem)
{intj=1;
structnode*node,*temp;
node=(structnode*)malloc(sizeof(structnode));
node->data=item;
temp=l->next;
if(temp==NULL)
if(i==0)
{l->next=node;
node->next=NULL;
return1;
}
else
return0;
while(j
=NULL)
{temp=temp->next;
j++;}
if(temp==NULL)return0;
node->next=temp->next;
temp->next=node;
return1;}
6、单链表的删除算法
structnode
{intdata;
structnode*next;};
intdel(structnode*l,inti)
{structnode*temp,*p;
intj=0;
temp=l;
if(temp->next==NULL)return0;
while(jnext!
=NULL)
{j++;
temp=temp->next;}
if(temp->next==NULL)return0;
p=temp->next;
temp->next=p->next;
free(p);
return1;
}
7、双向链表的插入算法
Structnode
{intdata;
structnode*lnext;
structnode*rnext;
};
intinsertdlist(structnode*l,inti,intitem)
{intj=1;
structnode*node,*temp;
node=(structnode*)malloc(sizeof(structnode));
node->data=item;
temp=l->rnext;
if(temp==NULL)
if(i==0)
{l->rnext=node;
node->rnext=NULL;
node->lnext=l;
return1;
}
else
return0;
while(j
=NULL)
{temp=temp->rnext;
j++;}
if(temp==NULL)return0;
node->rnext=temp->rnext;
node->lnext==temp;
temp->rnext->lnext=node;
temp->rnext=node;
return1;}
8、双向链表的删除算法
Structnode
{intdata;
structnode*lnext;
structnode*rnext;
};
intdeldlist(structnode*head,inti)
{
structnode*temp,*p;
intj=0;
temp=head;
if(temp->rnext==NULL)return0;
while(jrnext!
=NULL)
{j++;
temp=temp->rnext;
}
if(jrnext==NULL)return0;
temp->lnext->rnext=temp->rnext;
if(temp->rnext!
=NULL)
temp->rnext->lnext=temp->lnext;
free(temp);
return1;
}
9、顺序栈的入栈算法
Structnode
{intstack[20];
Inttop;
};
structnode*push(structnode*s,intx)
{
if(s->top==20)
returnNULL;
else
{
s->stack[s->top]=x;
s->top++;
returns;
}
}
10、顺序栈的出栈算法
Structnode
{intstack[20];
Inttop;
};
intpop(structnode*S)
{
if(S->top==0)
{
printf("\n顺序栈是空栈!
");
return0;
}
S->top--;
returnS->stack[S->top];
}
11、链栈的入栈算法
structnode
{intdata;
structnode*next;
};
structnode*push(structnode*top,intitem)
{
structnode*p;
p=(structnode*)malloc(sizeof(structnode));
p->data=item;
p->next=top;
top=p;
returntop;
}
12、链栈的出栈算法
structnode
{intdata;
structnode*next;
};
structnode*pop(structnode*top)
{
structnode*p;
if(!
top)
{
printf("链栈是空栈!
");
returnNULL;
}
p=top;
top=top->next;
free(p);
returntop;
}
13、链队的进队算法
structnode
{intdata;
structnode*next;
};
structlink
{structnode*front;
structnode*rear;
};
voidaddq(structlink*head,intitem)
{
structnode*p;
p=(structnode*)malloc(sizeof(structnode));
p->data=item;
p->next=NULL;
head->rear->next=p;
head->rear=p;
return;
}
14、链队的出队算法
structnode
{intdata;
structnode*next;
};
structlink
{structnode*front;
structnode*rear;
};
voiddelq(structlink*head)
{
structnode*p;
p=head->front;
if(!
p)
{
printf("空队不能做出队操作!
");
return;
}
head->front=head->front->next;
free(p);
return;
}
三、判断题
(T)1、栈和队列都是限制存取点的线性结构。
(F)2、设栈的输入序列是1,2,····n,若输出序列的第一个元素是n,则第i个输出元素是n-i+1。
(T)3、若一个栈的输入序列是1,2,3···n,输出序列的第一个元素是i,则第i个输出元素不确定。
(F)4、循环队列不会发生溢出。
(T)5、链队列与循环队列相比,前者不会发生溢出。
(T)6、直接或间接调用自身的算法就是递归算法。
(F)7、数据元素是数据的最小单位。
(T)8、数据结构是带有结构的数据元素的集合。
(F)9、算法的时间复杂度是算法执行时间的绝对度量。
(F)10、算法的正确性是指算法不存在错误。
(F)11、线性表的逻辑顺序与物理顺序总是一致的。
(F)12、线性表的顺序存储表示优于链式存储表示。
(T)13、线性表若采用链式存储表示时所有结点之间的存储单元地址可连续可不连续。
(F)14、二维数组是其数组元素为线性表的线性表。
(T)15、每种数据结构都应具备三种基本运算:
插入、删除和搜索。
(F)16、线性表的链式存储结构优于顺序存储结构。
(F)17、栈和队列也是线性表。
如果需要,可对它们中的任一元素进行操作。
(T)18、字符串是数据对象特定的线性表。
(F)19、在单链表P指针所指结点之后插入S结点的操作是:
P->next=S;S->next=P->next;
(T)20、一个无向图的连通分量是其极大的连通子图。
(T)21、邻接表可以表示有向图,也可以表示无向图。
(T)22、假设B是一棵树,B′是对应的二叉树。
则B的后根遍历相当于B′的中序遍历。
(F)23、通常,二叉树的第i层上有2i-1个结点。
(F)24、数据元素是数据的最小单位。
(F)25、数据的逻辑结构是指数据的各数据项之间的逻辑关系。
(F)26、算法的优劣与算法描述语言无关,但与所用计算机有关。
(T)27、健壮的算法不会因非法的输入数据而出现莫名其妙的状态。
(F)28、程序一定是算法。
(F)29、链表中的头结点仅起到标识的作用。
(T)30、顺序存储结构的主要缺点是不利于插入或删除操作。
(T)31、线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。
(F)32、顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。
(F)33、线性表的特点是每个元素都有一个前驱和一个后继。
(F)34、循环链表不是线性表。
(F)35、线性表只能用顺序存储结构实现。
(F)36、线性表就是顺序存储的表。
(F)37、即使对不含相同元素的同一输入序列进行两组不同的合法的入栈和出栈组合操作,所得的输出序列也一定相同。
(T)38、栈与队列是一种特殊操作的线性表。
(T)39、若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。
(F)40、队列是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
(T)41、循环队列也存在空间溢出问题。
(F)42、二叉树是度为2的有序树。
(T)43、完全二叉树中,若一个结点没有左孩子,则它必是树叶。
(F)44、数组是同类型值的集合。
(F)45、二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该树的根结点是那一个,则可以确定这棵二叉树。
(F)46、一棵有n个结点的二叉树,从上到下,从左到右用自然数依次给予编号,则编号为i的结点的左儿子的编号为2i(2i四、链表算法题
1、建立具有两个结点的链表,使其第一个结点的数据域的值大于第二个结点的值。
写出实现算法。
Create2N(head)
{p=malloc();
Scanf("%d",&p->data);
head=p;
p=malloc();
Scanf("%d",&p->data);
if(head->data>=p->data)
{head->next=p;
p->next=NULL;
}
else
{p->next=head;
head->next=NULL;
head=p;
}
}
2、设head是链表入口,请计算该链表中结点个数。
写出实现算法。
compute(head,p)
{p=0;i=head;
while(i!
=NULL)
{p++;
i=i->next;
}
printf("%d\n",p);
}
3、设head是链表入口,请计算该链表中数据域为偶数的结点个数。
写出实现算法。
compute(head,p)
{p=0;i=head;
while(i!
=NULL)
{if(i%2==0)
p++;
i=i->next;
}
printf("%d\n",p);
}
4、设head是链表入口,在结点p之后插入一个值为i的结点。
写出实现算法。
ins(head,p,i)
{
x=malloc(size);
x->data=i;
if(head=NULL)
{head=x;
x->next=NULL;
}
else
{x->next=p->next;
p->next=x;
}
}
5、设head是链表入口,查找数据域为key的结点,若找到,请删除该结点。
写出实现算法。
lgsearch(head,key)
{
w=head;p=head;
while((p!
=NULL)&&(p->data!
=key))
{w=p;p=p->next;
}
if(p==NULL)puts("NO!
");
else
{if(head==p)
head=p->next;
else
w->next=p->next;
}
}
五、队或栈算法题
1、有5个元素,其入栈次序为:
A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?
2、画出对算术表达式A-B*C/D-E求值时操作数栈和运算符栈的变化过程。
3、设输入序列为a,b,c,d,试写出借助一个栈可得到的两个输出序列和两个不能得到的输出序列。
4、设输入序列为1,2,3,4,5,试写出借助一个栈可得到的两个输出序列和两个不能得到的输出序列。
5、简述顺序存储队列的假溢出的避免方法及队列满和空的条件。
六、数组地址计算题
设有一数组A(1:
5,1:
8,1:
7)其元素在内存中按行主序存放。
若每一个数组元素占一个单元,且元素A(2,5,4)的地址为2000,则元素A(4,7,5)的地址是多少?
七、算法设计题
1、设一个有序线性表A(n),其表的最大长度是m(m>=n),试编一算法,使得已知的关键值KEY若在该线性表中就删除该元素。
#include
intfound(intv[],intkey,intn,int*sit)
{inti;
v[n]=32761;
i=0;
while(v[i]*sit=i;
if(v[i]==key)return
(1);
elsereturn(0);
}
voiddel(intv[],intsit,int*n)
{
intj;
for(j=sit;j<=*n-1;j++)
v[j]=v[j+1];
(*n)--;
}
main()
{inta[11],n,key,i,find,sit;
clrscr();
printf("inputnumbleofdata:
\n");
scanf("%6