开始学习数据结构时,还是很有必要自己手动撸一遍来实现各个功能的。
目录
没了,上代码!
int型元素为例。
顺序表
//顺序表
typedef struct{
ElemType *Elem; //基地址
int length; //当前长度(元素个数)
}SqList;
初始化
//初始化
Status InitList(SqList *L){
L->Elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!L->Elem){
printf("初始化分配内存失败");
return ERROR;
}
L->length=0;
return OK;
}
销毁
//销毁
Status DestroyList(SqList *L){
if(L->Elem){
free(L->Elem);
L->Elem=NULL;
return OK;
}
else printf("表已为空,无需销毁");
}
判断表空否
//判断表是否空
Status ListEmpty(SqList *L)
{
if (L->length == 0)
return OK;
else
return ERROR;
}
增
//增
Status ListInsert(SqList *L, int i, ElemType e){ //第i(非数组下标)个位置上添加新元素e,其中1<=i<=L->length+1
int j;
if((i<1) || (i>L->length+1)){
printf("插入位置不符合实际情况");
return ERROR;
}
if(L->length==MAXSIZE){
printf("表已满,无法插入");
return ERROR;
}
for(j=L->length-1;j>=i-1;j--)
L->Elem[j+1]=L->Elem[j]; //i位置之后的元素依次往后移
L->Elem[i-1]=e;
L->length++;
return OK;
}
删
//删
Status ListDelete(SqList *L, int i, ElemType *e){ //与增同理,但i的限制为1<=i<=L->length,删除元素存入e
int j;
if((i<1) || (i>L->length)){
printf("删除位置不符合实际情况");
return ERROR;
}
if(L->length == 0){
printf("表已空,无法删除");
return ERROR;
}
*e=L->Elem[i-1]; //赋值给e
for(j=i-1;j<=L->length-1;j++)
L->Elem[j]=L->Elem[j+1]; //i位置之后的元素依次往前移
L->length--;
return OK;
}
改
//改
Status AlterElem(SqList *L, int i, ElemType e){ //修改i位置上的元素
if((i<1) || (i>L->length)){
printf("修改位置不符合实际情况");
return ERROR;
}
L->Elem[i-1]=e; //赋值给e
return OK;
}
查
//查
Status LocateElem(SqList *L, ElemType e){ //若找到就返回位于序号(第几个)
int i;
for(i=0;i<L->length;i++){
if(L->Elem[i]==e){
return i+1;
}
}
return ERROR;
}
遍历(打印)表
//打印出表中的元素的值
void DisplayList(SqList *L){
int i;
for(i=0;i<L->length;i++){
printf("%3d", L->Elem[i]);
}
putchar('\n');
}
小测一下
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
//顺序表
typedef struct{
ElemType *Elem; //基地址
int length; //当前长度(元素个数)
}SqList;
//初始化
Status InitList(SqList *L){
L->Elem=(ElemType*)malloc(MAXSIZE*sizeof(ElemType));
if(!L->Elem){
printf("初始化分配内存失败");
return ERROR;
}
L->length=0;
return OK;
}
//销毁
Status DestroyList(SqList *L){
if(L->Elem){
free(L->Elem);
L->Elem=NULL;
return OK;
}
else printf("表已为空,无需销毁");
}
//判断表是否空
Status ListEmpty(SqList *L)
{
if (L->length == 0)
return OK;
else
return ERROR;
}
//增
Status ListInsert(SqList *L, int i, ElemType e){ //第i(非数组下标)个位置上添加新元素e,其中1<=i<=L->length+1
int j;
if((i<1) || (i>L->length+1)){
printf("插入位置不符合实际情况");
return ERROR;
}
if(L->length==MAXSIZE){
printf("表已满,无法插入");
return ERROR;
}
for(j=L->length-1;j>=i-1;j--)
L->Elem[j+1]=L->Elem[j]; //i位置之后的元素依次往后移
L->Elem[i-1]=e;
L->length++;
return OK;
}
//删
Status ListDelete(SqList *L, int i, ElemType *e){ //与增同理,但i的限制为1<=i<=L->length,删除元素存入e
int j;
if((i<1) || (i>L->length)){
printf("删除位置不符合实际情况");
return ERROR;
}
if(L->length == 0){
printf("表已空,无法删除");
return ERROR;
}
*e=L->Elem[i-1]; //赋值给e
for(j=i-1;j<=L->length-1;j++)
L->Elem[j]=L->Elem[j+1]; //i位置之后的元素依次往前移
L->length--;
return OK;
}
//改
Status AlterElem(SqList *L, int i, ElemType e){ //修改i位置上的元素
if((i<1) || (i>L->length)){
printf("修改位置不符合实际情况");
return ERROR;
}
L->Elem[i-1]=e; //赋值给e
return OK;
}
//查
Status LocateElem(SqList *L, ElemType e){ //若找到就返回位于序号(第几个)
int i;
for(i=0;i<L->length;i++){
if(L->Elem[i]==e){
return i+1;
}
}
return ERROR;
}
//打印出表中的元素的值
void DisplayList(SqList *L){
int i;
for(i=0;i<L->length;i++){
printf("%3d", L->Elem[i]);
}
putchar('\n');
}
void main(){
SqList L;
InitList(&L);
int i, n, loc;
ElemType e;
printf("输入要创建表的元素数量(1~100):\n");
scanf("%d", &n);
printf("依次输入元素的值:(回车键隔开)\n");
for(i=1;i<=n;i++){
scanf("%d", &e);
ListInsert(&L, i, e);
}
printf("表中包含的元素:\n");
DisplayList(&L);
printf("输入要增加的元素位置和值:(空格隔开)\n");
scanf("%d %d", &loc, &e);
ListInsert(&L, loc, e);
printf("表中包含的元素:\n");
DisplayList(&L);
printf("输入要删除的元素位置\n");
scanf("%d", &loc);
ListDelete(&L, loc, &e);
printf("表中包含的元素:\n");
DisplayList(&L);
printf("此时被删除的元素为%d\n", e);
printf("输入要修改的元素位置和值:(空格隔开)\n");
scanf("%d %d", &loc, &e);
AlterElem(&L, loc, e);
printf("表中包含的元素:\n");
DisplayList(&L);
printf("输入要查找的元素的值\n");
scanf("%d", &e);
if(LocateElem(&L, e))
printf("是第%d个元素", LocateElem(&L, e));
}
结果: