今天在实现顺序表的时候,就想着实现以下自由个数的元素的插入、删除;不知道写的对不对,还请大家帮忙看看 (这些就是在插入,删除中添加了循环,我只是觉得像之前那样频繁调用函数来实现元素的删除、插入很麻烦)
(代码中所指插入的位置就是将这一位来存放该元素,还有就是输入的位置的数字是站在用户角度,所以会比实际存储的下标大1 )
//动态顺序表的实现
#include <stdio.h>
#include <stdlib.h>
#define ElemType int
#define OK 1
#define ERROR -1
#define SIZE 10
typedef struct
{
ElemType* arr;
int length;//记录当前table的长度
int real_size;//记录表中的实际元素个数
}SqL,*SqList;
//INIT
int SqL_init(SqList L)
{
L->arr = (int*)malloc(sizeof(int) * SIZE);
if (!(L)->arr)
{
return ERROR;
}
L->length = SIZE;
L->real_size = 0;
return OK;
}
//IsEmpty
int IsEmpty(SqL L)
{
if (L.real_size == 0)
{
return 1;
}
else
{
return 0;
}
}
//insert
int SqL_insert(SqList L)
{
int num = 0;
int i = 0;
int value = 0;
int loc = 0;
if (L->real_size == L->length)//顺序表已满,就增加空间
{
int* pf = NULL;
(int*)pf = (ElemType*)realloc(L->arr,sizeof(int) * SIZE);
if (!pf)
{
perror("fail to create it>");
return -9999;
}
L->arr = pf;
}
printf("please input the NUMBER of that you wanna write>");
scanf("%d", &num);
if (num < 1)
{
printf("the number is illegal");
return ERROR;
}
printf("the length of table");
printf("\t%d", L->real_size);
for (i; i < num; i++)
{
int j = 0;
printf("\nplease input the VALUE of elemment>");
scanf("%d", &value);
printf("the length of table");
printf("\t%d", L->real_size);
printf("\ninput the LOCATION of the elemment> ");
scanf("%d", &loc);
if (loc<1 || loc>L->length)
{
printf("the position is illeagle>");
return -999;
}
for (j = L->real_size; j>= loc-1; j--)
{
*(L->arr + j + 1) = *(L->arr + j);
}
*(L->arr + loc-1) = value;
L->real_size++;
}
return OK;
}
//delete
int SqL_del(SqList L)
{
int num = 0;
int i = 0;
int loc = 0;//用户输入的位置,会比实际下标大1
int ret = IsEmpty(*L);
if (ret == 1)
{
return ERROR;
}
printf(" the CURRENT length of table");
printf("\t%d", L->real_size);
printf("\ninput the nember of NUMBER you wana delete>");
scanf("%d", &num);
for (i; i < num; i++)
{
int j = 0;
printf("the Length of table");
printf("\t%d", L->real_size);
printf("\ninput the LOCATION of the elemment> ");
scanf("%d", &loc);
if (loc<1 || loc>L->real_size)
{
printf("the position is illeagle>");
return -333;
}
for (j = loc - 1; j < L->real_size-1; j++)
{
*(L->arr + j) = *(L->arr + j + 1);
}
L->real_size--;
}
return OK;
}
//traverse
void SqL_traverse(SqL L)
{
int i = 0;
int ret = IsEmpty(L);
if (ret == 1)
{
return ERROR;
}
else
{
for (i; i < L.real_size; i++)
{
printf("%d\t", *(L.arr + i));
}
}
}
int main()
{
SqL S;
SqL_init(&S);
SqL_insert(&S);
SqL_del(&S);
printf("\n");
SqL_traverse(S);
return 0;
}
运行结果:
实现尾插法
头插法:
自由插入:
实现自由删除:
第一个位置(下标为0)插入,数据尾巴删除:
尝试的次数有些少,希望大家看看,有问题记得给我说一下