1、数据结构作业:
1 简述下列术语:线性表,顺序表,链表。
线性表:最常用且最简单的一种数据结构。一个线性表是n个数据元素的有限序列。
顺序表:是指用一组连续的存储单元一次存储线性表中的数据元素。物理结构和逻辑结构都相邻。
链表:逻辑结构相邻的数据元素物理结构不一定相邻。采用指针的形式连接起来。
2 何时选用顺序表,何时选用链表作为线性表的存储结构合适?各自的主要优缺点是什么?
不需要经常大量的修改表或需要随机存取的情况下可以选用顺序表;
相反需要经常大量的修改表,但不是频繁的随机存取的情况下可选用链式表。
3 在顺序表中插入和删除一个结点平均需要移动多少个结点?具体
2、的移动次数取决于哪两个因素?
答:平均需要移动n/2个结点。表的长度,和要插入的位置。
4 链表所表示的元素是否有序?如有序,则有序性体现于何处?链表所表示的元素是否一定要在物理上是相邻的?有序表的有序性又如何理解?
答:有序。有序性体现在通过指针数据元素有序的相连。物理上不一定要相邻。
5 设顺序表L是递增有序表,试写一算法,将x插入到L中并使L仍是递增有序表。
Status ListInsert(SqList &L,int i,ElemType e)
{
if((i>L.length+1)||i<1)
return ERROR;
if(L.length>=
3、L.listsize)
{
newbase=(ElemType *)realloc((L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(-1);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
ElemType *q,*p;
q=&L.elem[i-1];
for(p=&L.elem[L.length-1];p>=q;p--)
*(p+1)=*p;
*q=e;
L.length++;
return OK;
}
4、
6. B 7. C 8. C
9 写一求单链表的结点数目ListLength(L)的算法。
int ListLength(L)
{
int i=0;
ElemType *p;
p=&L;
if(!p)
exit(-1);
if(p.next==NULL)
return 0;
else
while(p.next!=NULL)
{
p++;
i++;
}
return i;
}
10 写一算法将单
5、链表中值重复的结点删除,使所得的结果链表中所有结点的值均不相同。
void DeletElem(SqList L)
{
ElemType *p,*q,*s;
int i=1;
int j;
p=&L.next.next;
for(i;idata==p->data)
{
p.next=(p-1).next;
s=p;
p++;
free(s);
}
}
if(j>i)
6、 p++;
}
}
11 写一算法从一给定的向量A删除值在x到y(x≤y)之间的所有元素(注意:x和y是给定的参数,可以和表中的元素相同,也可以不同)。
void DeletElem(SqList L,int x,int y)
{
ElemType *p,*q;
int i=0;
int j;
p=&L.next;
for(i;i=x||p.data<=y)
{
q=p;
(p-1).next=p.next;
p++;
free(q);
}
e
7、lse
p++;
}
}
12 设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。
void ListInsert(SqList A,SqList B,SqList C)
{
ElemType *p,*q,*s;
P=&A;
q=&B;
s=&C;
while(p.next!=NULL||q.next!=NULL)
{
if(p.next.data<=q.next.data)
{
if(s.next!=NULL)
p.next=s.next;
s.next=p.next;
p++;
}
else
{
if(s.next!=NULL)
q.next=s.next;
s.next=q.next;
q++;
}
}
while(p.next!=NULL)
{
p.next=s.next;
s.next=p.next;
}
while(q.next!=NULL)
{
q.next=s.next;
s.next=q.next;
}
}