线性表的学习

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值