Makefile
OBJS = main.o sqlist.o
CC = gcc
CFLAGS = -c -o
main:$(OBJS)
$(CC) $^ -o $@
%.o:%.c
$(CC) $^ $(CFLAGS) $@
clean:
$(RM) *.o main -r
main.c
#include <stdlib.h>
#include <stdio.h>
#include "sqlist.h"
int main() {
sqlist *list;
list = sqlist_create();
//sqlist_createone(&list);
int err = -1;
if (list == NULL) {
perror("list init faild");
exit(1);
}
int arr[] = {21, 34, 54, 98, 56, 1, 3, 5};
for (int i = 0;i < sizeof(arr)/sizeof(*arr);i++) {
if ((err = sqlist_insert(list, i, arr+i)) != 0){
if (err == -1){
perror("数组为空");
}else if (err == -2){
perror("插入失败");
}else{
perror("未知错误");
}
}
}
sqlist_show(list);
sqlist_delete(list, 5);
sqlist_show(list);
printf("顺序表长度: %d\n", sqlist_getnum(list));
int num = 5;
printf("%d的位置: %d\n",num ,sqlist_find(list, &num));
sqlist_destory(list);
exit(0);
}
sqlist.c
#include <stdio.h>
#include <stdlib.h>
#include "sqlist.h"
//创建线性表的第一种方式,返回表头
sqlist *sqlist_create(void)
{
sqlist *me = (sqlist*)malloc(sizeof(sqlist));
if(me == NULL)
return NULL;
me->last = -1;
return me;
}
//创建线性表的第二种方式,参数返回
void sqlist_createone(sqlist **ptr)
{
*ptr = (sqlist *)malloc(sizeof(sqlist));
if(*ptr == NULL)
return ;
(*ptr)->last = -1;
}
// 指定位置插入数据
int sqlist_insert(sqlist* me, int i, datatype* data)
{
if(me == NULL)
return -1;
if(i<0 || i>(me->last+1))
return -2;
for(int j=i; j<= me->last;j++)
{
me->data[j+1] = me->data[j];
}
me->data[i] = *data;
me->last++;
return 0;
}
int sqlist_destory(sqlist *me)
{
free(me);
return 0;
}
//删除某个数据
int sqlist_delete(sqlist*me, int i)
{
if(i<0 || i>me->last)
return -1;
for(int j=i;j<=(me->last);j++)
{
me->data[j] = me->data[j+1];
}
me->last--;
return 0;
}
int sqlist_find(sqlist*me, datatype*data)
{
if(sqlist_isempty(me) == 0)
return -1;
for(int i=0; i<=me->last;i++)
{
if(me->data[i] == *data)
{
return i;
}
}
return -2;
}
// 工具方法
int sqlist_isempty(sqlist *me)
{
if(me->last == -1 )
{
return 0;
}
return -1;
}
int sqlist_setempty(sqlist*);
int sqlist_getnum(sqlist*me)
{
return me->last;
}
void sqlist_show(sqlist *me){
if (me->last == -1) {
return;
}
for (int i = 0;i <= me->last;i++) {
printf("%d ", *(me->data+i));
}
printf("\n");
}
sqlist.h
#ifndef __SQLIST_H
#define __SQLIST_H
#define DATASIZE 1024
typedef int datatype;
typedef struct
{
datatype data[DATASIZE];//定义数组存放
int last;//当前包含个数or最后一个组员的下标
}sqlist;
sqlist *sqlist_create(void);
// 数据操作
int sqlist_insert(sqlist*, int, datatype*);
int sqlist_delete(sqlist*, int);
int sqlist_find(sqlist*, datatype*);
// 工具方法
int sqlist_isempty(sqlist*);
int sqlist_setempty(sqlist*);
int sqlist_getnum(sqlist*);
void sqlist_show(sqlist*);
int sqlist_destory(sqlist *me);
#endif // ! __SQLIST_H
大话数据结构的顺序存储的线性表的代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
//存储空间的初始化大小定义
#define MAXSIZE 20
typedef int Status;//状态的函数类型
typedef int ElemType;//元素的数据类型
//线性表的结构体定义
typedef struct LinearList
{
ElemType data[MAXSIZE];
int length;
}SqList;
//初始化线性表
Status InitList(SqList *L)
{
L->length = 0;
return OK;
}
//判断线性表是否为空
//空表返回TURE,否则返回FALSE
Status ListEmpty(SqList *L)
{
if(L->length == 0)
{
return TURE;
}
else
{
return FALSE;
}
}
//获取线性表的长度
//返回值是线性表的长度
int ListLength(SqList *L)
{
return L->length;
}
//获取线性表元素的值
//传入位置i,指针返回元素值e
Status GetElem(SqList L, int i, ElemType *e)
{
if(L.length == 0 || i < 1 || i > L.length)
{
return ERROR;
}
else
{
*e = L.data[i - 1];
return OK;
}
}
//确定元素e在线性表中的位置
//返回值是元素的位置
//如果元素不存在就返回0
int LocateElem(SqList L, ElemType e)
{
int i = 0;
if(L.length == 0)
{
return 0;
}
for(i = 0; i < L.length; i++)
{
if(L.data[i] == e) break;
}
if(i >= L.length)
{
return FALSE;
}
return i+1;
}
//插入元素
//指定位置插入元素
Status ListInsert(SqList *L, int i, ElemType e)
{
int k;
if(L->length == MAXSIZE)//数组满了
return ERROR;
//插入元素位置不对
if(i < 1 || i > (L->length + 1))
return ERROR;
//插入元素位置在范围之内
if(i <= (L->length + 1))
{
//从最后一个数字开始一直到插入位置往后移动一位
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;
}
//删除线性表某个位置的元素
//用指针e来返回
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-1; k <= (L->length - 1); k++)
{
L->data[k] = L->data[k+1];
}
}
L->length--;
return OK;
}
//遍历整个线性表
Status ListTraverse(SqList L)
{
int i;
if(L.length == 0)
return ERROR;
for(i = 0; i < L.length; i++)
{
printf("%d ",L.data[i]);
}
putchar('\n');
return OK;
}
//连接两个线性表
void unionL(SqList *La,SqList Lb)
{
int La_len, Lb_len, i;
ElemType e;
La_len = La->length;
Lb_len = Lb.length;
for(i = 1; i <= Lb_len; i++)
{
GetElem(Lb, i, &e);
ListInsert(La, ++La_len, e);
}
}
int main()
{
SqList L;
SqList Lb;
ElemType e;
Status i;
int j,k;
i = InitList(&L);
printf("初始化L后:L.length = %d\n",L.length);
for(j = 1; j <= 5; j++)
i = ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
i=ListEmpty(&L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
i=ListEmpty(&L);
printf("L是否空:i=%d(1:是 0:否)\n",i);
for(j=1;j<=10;j++)
ListInsert(&L,j+5,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
ListInsert(&L,1,0);
printf("在L的表头插入0后:L.data=");
ListTraverse(L);
printf("L.length=%d \n",L.length);
GetElem(L,5,&e);
printf("第5个元素的值为:%d\n",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d个元素的值为%d\n",k,j);
else
printf("没有值为%d的元素\n",j);
}
k=ListLength(&L); /* k为表长 */
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e); /* 删除第j个数据 */
if(i==ERROR)
printf("删除第%d个数据失败\n",j);
else
printf("删除第%d个的元素值为:%d\n",j,e);
}
printf("依次输出L的元素:");
ListTraverse(L);
j=5;
ListDelete(&L,j,&e); /* 删除第5个数据 */
printf("删除第%d个的元素值为:%d\n",j,e);
printf("依次输出L的元素:");
ListTraverse(L);
//构造一个有10个数的Lb
i=InitList(&Lb);
for(j=6;j<=15;j++)
i=ListInsert(&Lb,1,j);
unionL(&L,Lb);
printf("依次输出合并了Lb的L的元素:");
ListTraverse(L);
return 0;
}