参考《大话数据结构》:
环境:ubuntu16.04 vim
文件名称:sqlist.h sqlist.c main.c Makefile(放到同一个目录下)
实现功能:顺序线性表的插入、查找和删除
一、sqlist.h头文件
#ifndef __SQLIST_HEAD__
#define __SQLIST_HEAD__
#include
#include
#define MAXSIZE 20
#define OK 0
#define ERROR -1
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
/*extern 是变量或函数的申明,告诉编译器在其它文件中找这个变量或函数的定义*/
/*
*获取某个元素,用e返回L列表中的第i个数据元素的值
*L [IN]顺序列表
*i [IN]查找元素在列表中的位置
*e [IN, OUT]函数返回的数据元素值
*/
extern Status GetElem(SqList L, int i, ElemType *e);
/*
*插入某个元素,在L中第i个位置之前插入新的数据元素e,L的长度加1
*L [IN, OUT]顺序列表
*i [IN]查找元素在列表中的位置
*e [IN]函数返回的数据元素值
*/
extern Status ListInsert(SqList *L, int i, ElemType e);
/*
*删除某个元素,删除L的第i个数据元素,并用e返回其值,L的长度减1
*L [IN, OUT]顺序列表
*i [IN]查找元素在列表中的位置
*e [IN, OUT]函数返回的数据元素值
*/
extern Status ListDelete(SqList *L, int i, ElemType *e);
#endif
二、sqlist.c文件
#include "sqlist.h"
/*获取元素*/
Status GetElem(SqList L, int i, ElemType *e)
{
if (L.length == 0 || i < 1 || i > L.length)
{
return ERROR;
}
*e=L.data[i - 1];
return OK;
}
/*插入元素*/
Status ListInsert(SqList *L, int i, ElemType e)
{
int k;
if (L->length == MAXSIZE) //顺序线性表已经满
{
return ERROR;
}
if (i < 1 || i > L->length + 1) //当i不在范围内时
{
return ERROR;
}
if (i <= L->length) //若插入数据位置不在表尾
{
for(k = L->length - 1; k >= i - 1; k--)
{
L->data[k + 1] = L->data[k];
}
}
L->data[i - 1] = e; //将新元素插入
L->length++;
return OK;
}
/*删除某个元素*/
Status ListDelete(SqList *L, int i, ElemType *e)
{
int k;
if (L->length == 0) //线性表为空
{
return ERROR;
}
if (i < 1 || i > L->length) //删除位置不正确
{
return ERROR;
}
*e = L->data[i - 1];
if (i < L->length)
{
for(k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
}
L->length--;
return OK;
}
#include "sqlist.h"
int main()
{
SqList L;
for(int i = 0; i < 10; i++)
{
L.data[i] = i;
}
L.length = 10;
//获取元素示例
ElemType *e = NULL;
e = (ElemType*)malloc(sizeof(ElemType));
GetElem(L, 3, e);
printf("*e:%d\n", *e);
//插入某个元素
ListInsert(&L, 10, *e);
printf("L.data[9]:%d\n", L.data[9]);
//删除某个元素
ListDelete(&L, 10, e);
printf("*e:%d\n", *e);
for(int i = 0; i < L.length; i++)
{
printf("L.data[%d]:%d\n", i, L.data[i]);
}
free(e);
return OK;
}
#Makefile for building programmings
OBJS=sqlist.o main.o
CC=gcc
CFLAGS=-Wall -g
TARGET=sqlist
TARGET:$(OBJS)
$(CC) $(OBJS) -o $(TARGET)
sqlist.o:sqlist.c sqlist.h
$(CC) $(CFLAGS) -c $< -o $@
main.o:main.c sqlist.h
$(CC) $(CFLAGS) -c $< -o $@
.PHONY:clean
clean:
rm *.o sqlist
五、执行步骤及结构: