【DS专题活动】第二期解答及第三期(10月13日~10月19日)题目

frankzch 2003-10-15 09:34:56
第二期题目的解答讨论请参看这个帖子
http://expert.csdn.net/Expert/topic/2352/2352230.xml?temp=.8684503
本期题目如下:

第一题:在带头结点的单链表结构上实现线性表的基本操作LOCATE(L,X)和LENGTH(L).(L为线性表,X为表内元素)

第二题:已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长度分别为m和n。写一算法将两个链表连接在一起,用指针hc返回连接后的链表的头结点

第三题:已知指针la和lb分别指向两个无头结点单链表中的首元结点。编写算法从表la中删除自第i个元素起共len个元素后,将他们插入到表lb中第j个元素之前(la、lb、i、j、len均由函数参数表传入)
...全文
42 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankzch 2003-10-17
  • 打赏
  • 举报
回复
基本功扎实一些是最重要的,我们为什么崇拜StarFish?因为他基本功扎实,正如他自己说的,先要修炼内功,内功硬了,就能以不变应万变
想想那些少林寺的老秃驴们,哪个不是气定神闲,运筹帷幄,杀人于无形的?
heartup 2003-10-17
  • 打赏
  • 举报
回复
up
skywind 2003-10-16
  • 打赏
  • 举报
回复
哦,太简单了~~ 想了下没有做。
/\/\
(-.-;)
frankzch 2003-10-16
  • 打赏
  • 举报
回复
第一题:解答者 swtju94_2(program)(swtju94@163.com)
int Seq_Delete(SqList &a,int i,int k)
{//从顺序存储结构的线性表a中删除第i个元素起的k个元素
int count;
if(i<1||k<0||i+k-1>a.length) return -1; //错误返回
for(count=1;i+count-1<=a.length-k;count++)
a.elem[i+count-1]=a.elem[i+count+k-1];
a.length-=k;
return 1;
}//Seq_Delete

第二题:解答者 swtju94_2(program)(swtju94@163.com)
int Seq_Insert(SqList &va,ElemType x)
{//将x插入到递增有序的顺序表的适当位置上,以保持该表的有序性
int i;
va.length++;
if(va.length>va.listsize) //当前存空间已满,增加分配
{
ElemType *newbase=(ElemType*)
realloc(va.elem,(va.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);
va.elem=newbase;
va.listsize+=LISTINCREMENT;
}
for(i=va.length-1;va.elem[i]>x&&i>=0;i--)
va.elem[i+1]=va.elem[i];
va.elem[i+1]=x;
return 0;
}//Seq_Insert

第三题:解答者 frankzch(西方失败)(frankzch@163.com)
int List_Comp(SqList A,SqList B)
{//比较顺序表A和B,A>B返回正值;A<B返回负值;A=B返回0
for(i=0;i<A.length&&i<B.length;i++)
if(A.elem[i]!=B.elem[i]) return A.elem[i]-B.elem[i];
if(i==A.length)renturn -1;
if(i==B.length)renturn 1;
return 0;
}//List_Comp


hityu 2003-10-15
  • 打赏
  • 举报
回复
up
frankzch 2003-10-15
  • 打赏
  • 举报
回复
以下是plainsong(短歌)组的解答


/***************************************************************************
函数:IsValidList
功能:验证顺序表的合法性
参数:顺序表指针
返回值:int
非0值:合法
0:非法
*******************************************************************************/
int IsValidList(SqList* AList)
{
return AList != NUll &&
AList->length >= 0 &&
AList->listsize >= AList->length &&
AList->elem != NULL;
}

/******************************************************************************
函数:ListSetLength
功能:设置表的长度;可能会导致内存重分配。
参数:
SqList* AList:顺序表指针;必须是有效链表。
int NewLength:新的表长;必须>=0。
返回值:int
 1:成功。
 0:失败。
*******************************************************************************/
int ListSetLength(SqList* AList, int NewLength)
{
ElemType* NewElem;
int NewSize;
assert(NewLength>=0);
assert(IsValidList(AList));
if (NewLength > NewSize)
{
NewSize := (NewLength + LISTINCREMENT - 1) / LISTINCREMENT * LISTINCREMENT;
NewElem = (ElemType*) realloc(AList->elem, NewSize * sizeof(ElemType));
if (NewElem == NULL)
return 0;
else
{
AList->elem = NewElem;
AList->listsize = NewSize;
AList->length = NewLength;
return 1;
}
}
else
{
AList->length = NewLength;
return 1;
}
}
/******************************************************************************
函数:ListInit
功能:初始化表,分配内存。
参数:
SqList* AList:顺序表指针;必须是有效链表。
返回值:int
 1:成功。
 0:失败。
*******************************************************************************/
int ListInit(SqList* AList)
{
AList->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (AList->Elem == NULL)
return 0;
else
{
AList->listsize = LIST_INIT_SIZE;
AList->length = 0;
return 1;
}
}

/******************************************************************************
函数:ListClear
功能:清除表,释放内存。
参数:
SqList* AList:顺序表指针;必须是有效链表。
*******************************************************************************/
void ListClear(SqList* AList)
{
assert(IsValidList(AList));
free(AList->elem);
//以下操作是完全的实现,实际也可以不用或只在调试版本使用
AList->elem = NULL;
AList->length = 0;
AList->listsize = 0;
}

/*****************************************************************************
函数:SqList_Del
功能:从线性表ASqList中删除从第i个元素开始的k个元素;
参数:
  ASqList:线性表的指针;ASqList != NULL;*ASqList必须是有效的线性表。
  i:要删除的第一个元素的索引,索引采用从1开始的逻辑;0 < i <= SqList->length;
  k:要删除的元素个数,0<=k;
返回值:
  int:实际删除的元素个数。
  当k >= ASqList->length-i时删除从第i个元素开始的所有元素并返回(SqList->length - i + 1);
其余情况删除k个元素并返回k。
如果失败则返回-1。
******************************************************************************/
int SqList_Del( SqList * ASqList, int i, int k )
{
int n;
int Deleted;
int NewLength;
--i;//从1-Based到0-Based的索引逻辑的转换。
assert(IsValidList(ASqList));//*ASqList是有效线性表
assert(i >= 0 && i < ASqList->length);//参数i合法
assert(k >= 0);//参数k合法
if (k == 0)//避免当K为0时不必要的畸形赋值操作。
Deleted = 0;
else if ( ASqList->length - i > k ) //判断被删除的序列后面是否有元素
{
for ( n = i + k; n < ASqList->length; n++, i++ )//将后面的元素移到第i个元素开始的位置
{
ASqList.elem[i + 1] = ASqList.elem[n + 1] );
}
Newlength = ASqList.length - k;
Deleted = k;
}
else
{
Deleted = SqList->length - i;
NewLength = i;
}
if (!ListSetLength(NewLength))
return -1;
else
return Deleted;
}

/***************************************************************************
函数:SqList_Sort_Insert
功能:向升序线性表va中插入x,并保持线性表升序。
参数:
  SqList * va:线性表指针;不能为空指针,必须指向有效线性表。如果原表不是升序,则结果未定
    义(当前实现为正常插入,插入点为最后一个不大于x的元素之后)。
  ElemType x:将要插入元素。
返回值:
  int:新插入元素的位置,0-Based。失败时返回负数。
***************************************************************************/

int SqList_Sort_Insert( SqList *va, int x )
{
int i;
assert(IsValidList(va));//va是有效线性表
if (ListSetLength(va, va->length + 1))
{
i = va -> length - 1;//这里相当于你的i = length,因为这时length已经加1了。不过后面用的是i和i-1,所以不会越界。
while ( i > 0 && va->elem[i-1] > x )//从后向前寻找插入点,并把插入点后的元素向后移动一位
{
va->elem[i] = va->elem[--i];
}
va->elem[i] = x;
return i;
}
else
return -1;
}

/***************************************************************************
函数:SqList_Comp
功能:比较线性表A和B的大小。比较逻辑:
  设A=(a1,...,an)和B=(b1,...,bn)均为顺序表,A'和B'分别为A和B中除去最大共同前缀的子表。
  若A'=B'=空表,则A=B;
  若A'=空表,而B'!=空表,或者两者均不为空表,且A'的首元小于B'的首元,则A<B;
  否则A>B;
参数:
SqList* A,B:两个参与比较的线性表指针,都不能为空,必须指向有效线性表。
返回值:
int:比较结果。
1:A>B
0:A==B
-1:A<B
******************************************************************************/
int SqList_Comp( const SqList * A, const SqList * B )//错误1
{
int i,j,Result;

assert(IsValidList(A) && IsValidList(B));//A和B是有效线性表
i = 0;
j = 0;
while (i < A->length && j < B-> length && A->elem[i] == B->elem[j])
++i, ++j;

if (i >= A->length && j >= B -> length)//A' == nil && B' == nil
Result = 0;
else if (i >= A->length)//A' == nil && B' != nil
Result = -1;
else if (j >= A->length)//A' != nil && B' == nil
Result = 1;
else if (A->elem[i] > B->elem[i])//A'[0] > B'[0]
Result = 1;
else
Result = -1;
return Result;
}

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧