如何动态初始化顺序表

xiaha3 2003-11-22 02:09:42
如何动态初始化顺序表

struct SeqList{
DataType data[ListSize];//向量data用于存放表结点
int length;//当前的表长度
};
我想在程序运行是确定data的长度,也就是ListSize,怎么办.
...全文
268 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaha3 2003-11-22
  • 打赏
  • 举报
回复
不好意思,前面的我业应该给分.对不起了,下回的把
xiaoyige886 2003-11-22
  • 打赏
  • 举报
回复
哦 对了,多了一个交集的代码 void Intersect(SqList A,SqList B,SqList &C)

你把他删除就可以程序就可以通过了
xiaoyige886 2003-11-22
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <malloc.h>
#include<stdlib.h>
#include<assert.h>
#include<iostream>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; //自定义类型
typedef struct {
ElemType *elem; //元素
int length; //数组可用长度
int listsize; //数组总长度
} SqList;
/*函数:IsValidList
功能:验证顺序表的合法性
参数:顺序表指针
返回值:int
非0值:合法
0:非法
*/
int IsValidList(SqList* AList)//判断顺序表是否合法
{
return AList != NULL &&
AList->length >= 0 &&
AList->listsize >= AList->length &&
AList->elem != NULL;
}

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;
}
}
*/
函数: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 > AList->listsize)
{
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;
}
}
void ListClear(SqList* AList)
{
assert(IsValidList(AList));
free(AList->elem);
//以下操作是完全的实现,实际也可以不用或只在调试版本使用
AList->elem = NULL;
AList->length = 0;
AList->listsize = 0;
}

//求交集
void Intersect(SqList A,SqList B,SqList &C)
{
int i = 0;
int j = 0;
int k = 0;
ListSetLength(&C, min(B.length,A.length);//交集长度一定不长于两个集合长度的最小值。
while(i < A.length && j < B.length)
{
if(A.elem[i]< B.elem[j])
i++;
else if(A.elem[i]> B.elem[j])
j++;
else
{
C.elem[k++]= A.elem[i];
i++;
j++;
}
}
ListSetLength(&C, k);//重设交集长度。
}
void Print(SqList *Arr)
{
for (int i = 0; i < Arr->length; ++i)
printf("%d ", Arr->elem[i]);
printf("\n");
}

int main()
{
SqList list,qlist,plist;
int a[5] = {1,3,5,6,7};
int b[5] = {3,5,6,7,10};
ListInit(&list);
ListInit(&qlist);
ListInit(&plist);
ListSetLength(&list,5);
ListSetLength(&qlist,5);
for(int i = 0; i<5; ++i)
list.elem[i] = a[i];
for(int i = 0; i<5; ++i)
qlist.elem[i] = b[i];
Intersect(list,qlist,plist);
Print(&plist);

system("pause");
}


这是csdn数据结构专题活动的题解
在次特别感谢!
plainsong(短歌)
lishifeng 2003-11-22
  • 打赏
  • 举报
回复
把结构改了用就行了
struct SeqList{
DataType *pData;//指针pData用于指向存放表结点的内存
int ListSize; //最大长度
int length;//当前的表长度
};
JerryJun 2003-11-22
  • 打赏
  • 举报
回复
用模板,也只是在编译状态, 不能满足“我想在程序运行是确定data的长度,也就是ListSize,怎么办.”的条件
template <class T,int nInitSize,int nExtendSize>
class seqlist{
int length;//当前长度
int size;//容量
T * pData;//
seqlist(){
length = 0;
pData = new T[nInitSize];
size = nInitSize;
}
Add(const T& _t){
if(length + 1 < size){
pData[length] = _t;
length++;
}else{
T* pTemp = new T[size+ nExtendSize];
size = length + nExtendSize;
for(int i = 0;i<length;i++){
pTemp[i] = pData[i];
}
delete[] pData;
pData = pTemp;
pData[length] = _t;
length++;
}
}
}
liuleilover 2003-11-22
  • 打赏
  • 举报
回复
做一个模板类
如:
template <class DataType,int ListSize>
class SeqList
{
DataType data[ListSize];
int length;
};

调用时可以用
SeqList<char,int>* plist=new SeqList<char,5>;
你可以试一试.

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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