静态顺序表的初始化以及插入删除操作
– 在编写之前首先需要说明,在使用C语言编写时,在自定义外函数(也就是在main函数体之外)体内不能使用 & 符号以及“ . ”符号,取而代之的是 * 号以及“ -> ”符号
1. 首先是静态顺序表结构体的编写
typedef struct
{
int data[MaxSize];
int length;
}Sqlist;
2. 初始化
void InitList(Sqlist *L)
{
L->length = 0;
}
3. 插入操作
bool ListInsert(Sqlist *L,int i,int e){
if (i<1||i>L->length+1)
{
return false;
}
if (L->length>=MaxSize)
{
return false;
}
for (int j =L->length; j>=i; ++j)
{
L->data[j]=L->data[j-1];
}
L->data[i-1]=e;
L->length++;
return true;
}
4. 删除操作
- 在这里我们是按照所在位置进行删除,i 是元素的位置,使用 empt 对删除的元素进行返回
bool ListDelet(Sqlist *L,int i,int *empt){
if (L->length<1||i<1||i>=L->length)
{
return false;
}
*empt=L->data[i];
for (int j = i; j< L->length-1; ++j)
{
L->data[j]=L->data[j+1];
}
L->length--;
return true;
}
- 对元素进行查找删除,删除所有对应的元素,这里的 i 是指我们要删除的元素,而 empt 则是用来返回删除的个数
bool ListValueDelet(Sqlist *L,int i,int *empt){
if (L->length<1)
{
return false;
}
int k=0;
for (int j =0; j< L->length-k; ++j)
{
while(L->data[j]==i){
for (int n = j; n < L->length-k-1; ++n)
{
L->data[n]=L->data[n+1];
}
++k;
}
}
*empt=k;
L->length-=k;
return true;
}
完整代码如下
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MaxSize 50
#define bool int
#define true 1
#define false 0
//结构体定义
typedef struct
{
int data[MaxSize];
int length;
}Sqlist;
//初始化
void InitList(Sqlist *L)
{
L->length = 0;
}
//插入操作
bool ListInsert(Sqlist *L,int i,int e){
if (i<1||i>L->length+1)
{
return false;
}
if (L->length>=MaxSize)
{
return false;
}
for (int j =L->length; j>=i; ++j)
{
L->data[j]=L->data[j-1];
}
L->data[i-1]=e;
L->length++;
return true;
}
//按位置进行删除
bool ListDelet(Sqlist *L,int i,int *empt){
if (L->length<1||i<1||i>=L->length)
{
return false;
}
*empt=L->data[i];
for (int j = i; j< L->length-1; ++j)
{
L->data[j]=L->data[j+1];
}
L->length--;
return true;
}
//按值查找删除
bool ListValueDelet(Sqlist *L,int i,int *empt){
if (L->length<1)
{
return false;
}
int k=0;
for (int j =0; j< L->length-k; ++j)
{
while(L->data[j]==i){
for (int n = j; n < L->length-k-1; ++n)
{
L->data[n]=L->data[n+1];
}
++k;
}
}
*empt=k;
L->length-=k;
return true;
}
int main()
{
Sqlist L;
InitList(&L);
ListInsert(&L,1,8);
ListInsert(&L,2,9);
ListInsert(&L,3,10);
ListInsert(&L,4,6);
ListInsert(&L,5,6);
ListInsert(&L,6,6);
ListInsert(&L,7,4);
for (int i = 0; i < L.length; ++i)
{
printf("%d ", L.data[i]);
}
printf("顺序表的长度为:%d\n",L.length );
int empt;
ListDelet(&L,2,&empt);
printf("删除的元素为:%d\n",empt);
for (int i = 0; i < L.length; ++i)
{
printf("%d ", L.data[i]);
}
printf("顺序表的长度为:%d\n",L.length );
int count;
ListValueDelet(&L,6,&count);
printf("删除元素6的次数为:%d\n",count);
for (int i = 0; i < L.length; ++i)
{
printf("%d ", L.data[i]);
}
printf("顺序表的长度为:%d\n",L.length );
return 0;
}
- 输出如下所示
-