编写一个程序,动态地创建顺序表一个顺序表。
要求:顺序表的初始长度为10,向顺序表中输入15个整数,并打印出来;再删除顺序表中的第5个元素,打印出删除后的结果。
/****************************************1-1.c***********************************************/
#include "stdio.h"
#include "conio.h"
#define MaxSize 10
typedef int ElemType; //将int定义为ElemType
typedef struct{
int *elem;
int length;
int listsize;
}Sqlist;
/**初始化一个顺序表**/
void initSqlist(Sqlist *L){
L->elem = (int *)malloc(MaxSize*sizeof(ElemType));
if(!L->elem) exit(0);
L->length =0;
L->listsize =MaxSize;
}
/**向顺序表中插入元素**/
void InsertElem(Sqlist *L, int i, ElemType item){
ElemType *base,* insertPtr,*p;
if(i<1||i>L->length+1)
exit(0);
if(L->length>=L->listsize)
{
base =(ElemType*)realloc(L->elem,(L->listsize+10)*sizeof(ElemType));
L->elem =base;
L->listsize = L->listsize+100;
}
insertPtr = &(L->elem[i-1]);
for(p=&(L->elem[L->length-1]); p>=insertPtr ; p++)
*(p+1)=*p;
* insertPtr = item;
L->length++;
}
/**向顺序表中删除元素**/
void DelElem(Sqlist *L, int i){
ElemType *delItem,*q;
if(i<1||i>L->length)
exit(0);
delItem = &(L->elem[i-1]);
q=L->elem+L->length-1;
for(++delItem; delItem<=q; delItem)
*(delItem-1)=* delItem;
L->length--;
}
/**主函数**/
main()
{
Sqlist l;
int i;
initSqlist(&l); //初始化一个顺序表
for(i=0;i<15;i++)
InsertElem(&1,i+1,i+1); //向动态顺序表中插入1-15
printf("\nThe content of the list is\n");
for(i=0;i<l.length;i++)
printf("%d",l.elem[i]);
DelElem(&l,5);
printf("\nDelete the fifth element\n");
for(i=0;i<l.length;i++)
printf("%d",l.elem[i]);
getche();
}
程序运行结果如下:
The content of the list is
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Delete the fifth element
1 2 3 4 6 7 8 9 10 11 12 13 14 15
程序解释:
(1)程序首先用函数initSqlist()动态创建一个顺序表,初始化长度为MaxSize=10.
(2)通过InsertElem()动态地向顺序表中插入数据,由于顺序表初始化长度为10,而要插入15个元素,因此要调用realloc()函数为顺序表重新分配空间。realloc函数解释见下。
(3)再应用DelElem()函数删除表重第5个元素。
学习realloc函数
realloc函数是用来重新分配内存空间的,
void* realloc(void* ptr, size_t size);
参数说明:ptr为需要重新分配的内容空间指针,size为新的内存空间的大小
头文件:#include <stdlib.h>
返回值:分配成功返回新的内存地址,可能与ptr相同,也可能不同;失败则返回NULL