可变长顺序表设计
设计要求
(1)使用动态数组结构。
(2)顺序表的操作包括:初始化,求数据元素个数,插入、删除、取数据元素,编写每个操作的函数。
(3)设计一个测试主函数
头文件DString.h
typedef struct
{
char *str;
int maxLength;
int length;
}DString;
void Initiate(DString *S,int max,char *string)
{
int i;
S->str=(char *)malloc(sizeof(char)*max); //申请动态数组空间
S->maxLength = max; //置动态数组元素最大个数
S->length =strlen(string); //置串的当前长度值
for(i=0;i<S->length;i++)
{
S->str[i] = string[i]; //赋值
}
}
int Insert(DString *S,int pos,DString T)
{
int i;
if(pos<0)
{
printf("参数pos出错");
return 0;
}
else
{
if(S->length + T.length>S->maxLength)
{
//重新申请S->str所指数组空间,原数组元素存放在新数组的前面
realloc(S->str,(S->length+T.length)*sizeof(char));
S->maxLength=S->length+T.length;
}
for(i=S->length-1;i>=pos;i--)
S->str[i+T.length] = S->str[i]; //依次后移T.length个位置
for(i=0;i<T.length;i++)
S->str[pos+i]=T.str[i]; //插入
S->length+=T.length; //置新的数据元素个数
return 1;
}
}
int Delete(DString *S,int pos,int len)
//删除主串S从pos位置开始的长度为len的子串,删除成功返回1,失败则返回0
{
int i;
if(S->length<=0)
{
printf("数组中未存放字符无元素可删");
return 0;
}
else if(pos<0||len<0||pos+len>S->length)
{
printf("参数pos和len不合法");
return 0;
}
else
{
for(i=len+pos;i<=S->length-1;i++)
S->str[i-len]=S->str[i]; //依次前移len个位置
S->length=S->length-len; //置新的数据元素个数
return 1;
}
}
int SubString(DString *S,int pos,int len,DString *T)
//取主串S从pos位置开始的长度为len的子串,取成功则返回1,失败则返回0
{
int i;
if(pos<0||len<0||len+pos>S->length)
{
printf("参数pos和len出错");
return 0;
}
if(len>T->maxLength)
{
T->str=(char *)malloc(len*sizeof(char)); //重新申请数组空间
T->maxLength =len;
}
for(i=0;i<len;i++)
T->str[i] =S->str[pos+i];
T->length = len;
return 1;
}
void Destroy(DString *S)
//撤销串S占用的内存空间
{
free(S->str);
S->maxLength=0;
S->length =0;
}
测试主函数
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include"DString.h"
void main(void)
{
DString myString1,myString2,myString3;
int i,max1=5,max2=9,max3=0;
//测试初始化函数
Initiate(&myString1,max1,"Data");
Initiate(&myString2,max2,"Structure");
Initiate(&myString3,max3,"");
printf("初始myString串: ");
for(i=0;i<myString2.length;i++)
printf("%c",myString2.str[i]);
printf(" maxLength = %d",myString2.maxLength);
printf(" Length = %D\n",myString2.length);
//测试插入函数
Insert(&myString2,0,myString1);
printf("插入字符串后myString2串: ");
for(i=0;i<myString2.length;i++)
printf("%c",myString2.str[i]);
printf(" maxLength = %d",myString2.maxLength);
printf(" Length = %D\n",myString2.length);
//测试删除函数
Delete(&myString2,0,5);
printf("删除字符串后myString2串: ");
for(i=0;i<myString2.length;i++)
printf("%c",myString2.str[i]);
printf(" maxLength = %d",myString2.maxLength);
printf(" Length = %D\n",myString2.length);
//测试取子串函数
SubString(&myString2,0,5,&myString3);
printf("取子串后myString3串: ");
for(i=0;i<myString3.length;i++)
printf("%c",myString3.str[i]);
printf(" maxLength = %d",myString3.maxLength);
printf(" Length = %D\n",myString3.length);
//测试撤销函数
Destroy(&myString1);
Destroy(&myString2);
Destroy(&myString3);
}