首先声明一个顺序表的结构 (数组的第一个元素是0,但是顺序表的第一个一般 从1(人为设定)开始)
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define OK 1
#define FALSE 0
typedef int Elemtype;
typedef bool Status;
typedef struct list
{
Elemtype *elem;
int len; //数据个数
int listsize; //顺序表长度
}List;
listsize
代表这个顺序表的最大容量,可以随时扩容len
代表在你创建的这个顺序表中有几个有效的数据,总是小于等于listsize
一、初始化顺序表属性
void list_init(List *L)
{
L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间
if(L->elem==NULL)//判断空间是否开辟成功
{
printf("malloc fail\n");
exit(0);
}
L->len=0; //初始化数据有效数据为0
L->listsize=MAXSIZE; //初始化数组长度为MAXSIZE
}
二、顺序表的插入
Status list_insert(List *L,int i,Elemtype data)
{
Elemtype *base,*insert,*p;
if(i<1 || i>L->len+1 || L==NULL)
{
printf("位置输入错误\n");
return FALSE;
}
if(L->len > L->listsize)
{
base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));//动态扩容
L->elem=base;
L->listsize+=MAXSIZE;//更新顺序表大小
}
insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址
//指向最后一个元素的地址
for(p=L->elem + L->len-1;p>=insert;p--)
{
*(p+1)=*p;
}
*insert=data;
L->len++;
return OK;
}
三、删除
Status delete_list(List *L,int i)
{
ElemType *q,*delete_i;
if(L==NULL||i<0||i>L->len)
return FALSE;
delete_i=&(L->elem[i-1]);//用指针指向要删除位置的地址
q=L->elem + L->len-1; //q指针指向顺序表最后一个位置的地址 首地址加上数组长度就是最后一个元素地址
for(delete_i=delete_i+1;delete_i<=q;++delete_i)//从删除位置的地址的下一个元素开始,每个往前移动一位
{
*(delete_i-1)=*delete_i; //前一个位置等于后一个
}
L->len--;
return OK;
}
全部程序
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define OK 1
#define FALSE 0
typedef int Elemtype;
typedef bool Status;
typedef struct list
{
Elemtype *elem;
int len;
int listsize;
}List;
void list_init(List *L)
{
L->elem=(Elemtype *)malloc(MAXSIZE*sizeof(Elemtype));//开辟空间
if(L->elem==NULL)//判断空间是否开辟成功
{
printf("malloc fail\n");
exit(0);
}
L->len=0; //初始化数据有效数据为0
L->listsize=MAXSIZE; //初始化数组长度为MAXSIZE
}
Status list_insert(List *L,int i,Elemtype data)
{
Elemtype *base,*insert,*p;
if(i<1 || i>L->len+1 || L==NULL)
{
printf("位置输入错误\n");
return FALSE;
}
if(L->len > L->listsize)
{
base=(Elemtype *)realloc(L->elem,(L->listsize+MAXSIZE)*sizeof(Elemtype));
L->elem=base;
L->listsize+=MAXSIZE;
}
insert=&(L->elem[i-1]);//目标指针指向要插入的目标地址
//指向最后一个元素的地址
for(p=L->elem + L->len-1;p>=insert;p--)
{
*(p+1)=*p;
}
*insert=data;
L->len++;
return OK;
}
Status list_delete(List *L,int i)
{
Elemtype *aim,*p;
if(i<0 || i>L->len)
{
printf("位置输入错误\n");
return FALSE;
}
aim=&(L->elem[i-1]);//目标指针指向要删除的目标地址
p=(L->elem+L->len-1); //指向最后一个元素的地址
for(aim=aim+1;aim<=p;++aim) //目标地址滑动删除
{
*(aim-1)=*aim;
}
L->len--;
return OK;
}
void show_list(List *L)
{
int i;
for(i=0;i<L->len;i++)
{
printf("elem[%d]=%d\n",i+1,L->elem[i]);
}
printf("\n");
}
int main()
{
int i;
List L;
list_init(&L);
for(i=0;i<10;i++)
{
list_insert(&L,i+1,i+1);
}
printf("插入前的顺序表\n");
show_list(&L);
printf("插入后的顺序表 在5位置插入99\n");
list_insert(&L,5,99);
show_list(&L);
printf("删除后的顺序表 把5位置删除\n");
list_delete(&L,5);
show_list(&L);
return 0;
}
运行结果如下
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。