数据结构学习第一天

  线性表线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列

  线性表的结构包括顺序存储和链式存储(这次展示的是顺序存储。。。) 

//数据类型:
typedef int ElemType; typedef struct { ElemType *elem; int lenght; int listSize; //当前分配的储存容量 }SqList;
/*具体实现*/
//
线性表(顺序表的实现)初始化 Status InitList(SqList *L) { ElemType *p; p = (ElemType *)malloc(LIST_INT_SIZE * sizeof(ElemType)); if (!p) { printf("InitList Error:%d", OVERFLOW); } L->elem = p; L->lenght = 0; L->listSize = LIST_INT_SIZE; return OK; } //删除表中的数据 Status ListDelete(SqList *L,int pos,ElemType *e) { if (L->lenght <= 0)return OK; int i = 0; *e = L->elem[pos - 1] ; for (i = pos-1; i < L->lenght-1; i++) { L->elem[i] = L->elem[i + 1]; } L->lenght--; return OK; } //销毁线性表 Status DestoryList(SqList *L) { free(L->elem); L->elem = NULL; L = NULL; printf("SqList 销毁成功 !!! \n"); return OK; } Status ClearList(SqList *L) { int i = 0; for (i = 0; i < L->listSize;i++) { L->elem[i] = -1; } L->lenght = 0; return OK; } //在第i个位置插入e Status ListInsert(SqList *L, int pos, int e) { ElemType *p =NULL; //判断表是否达到上限 int i = 0; if (L->lenght >= L->listSize) { //表达到上限 扩展表 p = (ElemType *)malloc(LIST_INT_SIZE * 2 * sizeof(ElemType));//扩展原来的二倍 if (!p)return OVERFLOW; //将原先表中的数据拷贝到新表中 for (i = 0; i < L->lenght; i++) { p[i] = L->elem[i]; } //修改数据 L->listSize = 2 * LIST_INT_SIZE; L->elem = p; } //添加的数据 for (i = L->lenght - 1; i >= pos - 1; i--) { L->elem[i + 1] = L->elem[i]; } L->elem[pos] = e;    L->lenght++; return OK; } //测试插入元素 void test(SqList *L) { int i = 0; for (i = 0; i < 10; i++) { (*L).elem[i] = i + 1; (*L).lenght++; } } //打印 void printList(SqList L) { int i = 0; for (i = 0; i < L.lenght; i++) { printf("%d ", L.elem[i]); } printf("\n%d", L.lenght); }

测试数据:

Status main()
{
    Status flag = 0;
    SqList L;
    int i = 0;
    ElemType e;
    flag = InitList(&L);
    if(flag !=0)
    {
        printf("InitList fun Error:%d", flag);
        exit(ERROR);
    }
    test(&L);


    for (i = 0; i < 10; i++)
    {
        printf("%d  ", L.elem[i]);
    }
    printf("\n%d", L.lenght);
    printf("\n");
    flag = ListInsert(&L, 8, 111);
    if (flag != 0)
    {
        printf("ListInsert fun Error:%d", flag);
        exit(ERROR);
    }
    printList(L);
    flag = ListDelete(&L,8,&e);
    if (flag != 0)
    {
        printf("ListInsert fun Error:%d", flag);
        exit(ERROR);
    }
    printf("\n元素e:%d已被删除\n",e);
    printList(L);
    system("pause");
    return OK;
}

线性表更复杂的操作合并两个线性表中的不同数据La={1,2,3,4,5} Lb={6,7,8,9,10} union之后La=La(没合并之前的a表)ULb={1,2,3,4,5,6,7,8,9,10}

//线性表L已经存在,compare() 返回第一个与e满足关系的 数据 位次。若没有这样的数据返回0
//这样 的函数 称为回调函数(使用到函数指针)
Status LocateElem(SqList *L, ElemType e, Status(*compare)(ElemType, ElemType))
{
    //这里主要判断两个元素的关系 
    int i = 0;
    /*默认的索引在这里 定义约束 元素的下标+1*/
    for (i = 0; i < L->lenght; i++)
    {
        if (compare(L->elem[i], e))
        {
            //相等返回下标
            return i + 1;
        }
    }

    return 0;
}
/*用户自定义方法*/
Status equal(ElemType e1, ElemType e2)
{
    if (e1 == e2)
    {
        return 1;
    }

    return 0;
}
/*将L2中的数据拷贝到L1中(L1中不包含的数据)*/
void unionSq(SqList *L1,SqList L2)
{
    int la_len = L1->lenght;
    int lb_len = L2.lenght;
    int i = 0;

    for (i = 0; i < lb_len; i++)
    {
        //判断La中是否有Lb中的数据
        if (!LocateElem(&(*L1), L2.elem[i], equal))
        {
            ListInsert(&(*L1), la_len + i, L2.elem[i]);

            //(*L1).lenght++;
        }
    }

    return OK;
}

理论知识参考数据结构(严蔚敏) 算法2.1

  

posted @ 2019-03-05 23:12  雪之下  阅读(159)  评论(0编辑  收藏  举报