1,顺序表
实现顺序存储当然是用数组了
为了方便修改和阅读,将表的声明和方法实现都放在 .h 文件中,在.c 文件中 include进来就行了
当然方法只写了一部分常用到的
SeqList.h
//结构体声明,MaxSize在使用时指定,size表示当前数组元素个数
typedef struct
{
DataType list[MaxSize];
int size;
}SeqList;
//初始化,我们在应用时,会新建一个SeqList的结构体,然后传它的地址到这个函数
void ListInitiate(SeqList* L)
{
L->size=0;
}
//得到元素个数
int ListLength(SeqList L)
{
return L.size;
}
//插入元素
int ListInsert(SeqList* L,int i,DataType x)
{
int j;
if(L->size>=MaxSize) //因为是数组,我们是不能让它插到数组外面去的
{
printf("顺序表已满,无法插入!\n");
return 0;
}
else if(i<0||i>L->size)//
{
printf("参数i不合法!\n");
return 0;
}
else
{ //让插入点之后的所有元素都向后移一个位置
for(j=L->size;j>i;j--)
L->list[j]=L->list[j-1];
//在list[i]这里插入x
L->list[i]=x;
L->size++; //元素个数加1
return 1;
}
}
//删除元素,指针x来保存删除的这个元素
int ListDelete(SeqList* L,int i,DataType *x)
{
int j;
if(L->size<=0)
{
printf("表已经空,没有元素可删除!\n");
return 0;
}
else if(i<0||i>=L->size-1) //因为下标是从0开始的,所以最后一个元素下标是size-1
{
printf("参数i不合法!\n");
return 0;
}
else
{
*x=L->list[i]; // *x 暂存list[i]的值,这里好像没必要了哈,但是有时候可以返回这个值撒
for(j=i+1;j<L->size;j++) // list[j] 和它后面的元素都向前面移一格
L->list[j-1]=L->list[j];
L->size--;
return 1;
}
}
//读取数据元素
int ListGet(SeqList L,int i,DataType *x)
{
if(i<0||i>L.size-1)
{
printf("参数i不合法!");
return 0;
}
else
{
*x=L.list[i]; // *x 用来存它
return 1;
}
}
然后就是主函数了
sxList.x
#include <stdio.h>
#define MaxSize 100 //这里,一定在把这两句放在include "SeqList.h"的前面,不然它就不知道MaxSize
typedef int DataType; //和DataType到底是个什么东西
#include "SeqList.h"
void main(void)
{
SeqList myList; //声明一个SeqList型的myList
int i,x;
ListInitiate(& myList); //初始化myList,对myList操作,要传址
for(i=0;i<10;i++)
{
if(ListInsert(&myList,i,i+1)==0) //这种方法!!每次调用都进行错误判断,很好
{
printf("error!\n");
return;
}
}
if(ListDelete(&myList,4,&x)==0)
{
printf("error!\n");
return;
}
for(i=0;i<ListLength(myList);i++)
{
if(ListGet(myList,i,&x)==0)
{
printf("error!\n");
return;
}
else
printf("%d ",x); // x是个全局的,上面给它值后,运行到这里这会输出,然后继续循环
}
}
评论