现在的位置: 首页 > 综合 > 正文

数据结构学习笔记(顺序表的基本操作)

2018年05月19日 ⁄ 综合 ⁄ 共 3322字 ⁄ 字号 评论关闭

万事开头难。
参考了严蔚敏的数据结构教材,写了如下代码。
新手上路还请老鸟多多指教。

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1 
#define True 1
#define FALSE 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10 //线性表存储空间的初始分配量
#define LIST_INCREMENT 2  //线性表存储空间的分配增量
typedef int Status;
typedef int ElemType;

typedef struct
{
    ElemType *elem;       //存储空间基址
    int length;           //当前长度
    int listsize;         //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;


//---------------初始化(实质为SqList三个属性赋初值)-------------

Status InitList(SqList *L)
{
    //构造一个空的线性表L
    (*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
    if(!(*L).elem)
        exit(OVERFLOW);
    (*L).length = 0;
    (*L).listsize = LIST_INIT_SIZE;
    return OK;
}


//-----------------------插入元素-------------------------
Status ListInsert(SqList *L,int i,ElemType e)
{
/*
实现过程梳理:
1.判断插入位置的合法性 
2.判断存储空间是否够 
3.移动i位置以后的所有元素
4.插入新的值并表长自增
*/
    ElemType * newbase, * q, * p;
    if(i < 1 || i > (*L).length + 1)       //i的值不合法
        return ERROR; 
    if((*L).length >= (*L).listsize)
    {
        newbase = (ElemType * )realloc((*L).elem,((*L).listsize + LIST_INCREMENT) * sizeof(ElemType));
        if(!newbase)
           exit(OVERFLOW);
        (*L).elem = newbase;
        (*L).listsize += LIST_INCREMENT;
    }
    q = (*L).elem + i - 1 ;  //q 指向第i个位置
    for(p = (*L).elem + (*L).length - 1; p >= q ; --p)  //插入位置及之后的元素后移
        * (p + 1) = * p;
    * q = e;      //插入元素e
    ++(*L).length;  //表长增1
    return OK;
} 


//------------------------删除元素--------------------------
Status ListDelete(SqList *L,int i,ElemType *e)
{
/*
实现过程梳理:
1.判断插入位置的合法性
2.被删除元素之后的元素向前移动
*/
    ElemType  * p,* q;  
    if(i < 1 || i > (*L).length )
        return ERROR;
    p = (*L).elem + i - 1;
    * e = * p;
    q = (*L).elem + (*L).length - 1;
    for(++p ; p <= q ; ++p)
       *(p - 1) = * p;
    --(*L).length;
    return OK;
}


//-----------------------返回表长-------------------------
int ListLength(SqList L)
{
    return L.length;
}

//------------------------返回元素---------------------------
Status GetElem(SqList L,int i,ElemType *e)
{
    if(i < 1 || i > L.length)
        exit(ERROR);
    * e = * (L.elem + i - 1);
    return OK;
}

//--------------------返回某个元素的位置---------------------
int LocateElem(SqList L,ElemType e,Status(* compare)(ElemType,ElemType))
{
    ElemType * p;
    int i = 1;
    p = L.elem;
    while(i <= L.length && !compare(*p++,e))
        i++;
    if(i <= L.length)
        return i;
    else
        return 0;
}

Status compare(ElemType c1,ElemType c2)
{
    if(c1 == c2)
        return True;
    else
        return FALSE;
}

//------------------------遍历线性表-------------------------
Status ListTraverse(SqList L, void(* visit)(ElemType *c))
{
    ElemType * p;
    int i;
    p = L.elem;
    for(i = 1 ; i <= L.length ;i ++)
       visit(p++);
    printf("\n");
    return OK;
}

void visit(ElemType *c)
{
    printf("%d ", *c);
}

-------------------以下为main函数----------------
int main()
{
    SqList L;
    ElemType e;
    Status i;
    i = InitList(&L);
    printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
    int j,k,position;
    for(j = 1 ; j <= 5 ; j++)
        i = ListInsert(&L,1,j);
    printf("在L的表头依次插入1  -  5之后:\n");
    for(j = 1 ; j <= 5 ; j++)
        printf("%d ",*(L.elem + j - 1));
    printf("\n");
    printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
    for(j = 1 ;j <= 10 ;j++)
        ListInsert(&L,j,j);
    printf("继续插入元素,即在位置 1 - 10 依次插入元素 1 - 10 后:\n");
    for(j = 1 ; j <= ListLength(L) ; j++)
       printf("%d ",*(L.elem + j - 1));
    printf("\n");
    printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
    GetElem(L,5,&e);
    printf("第五个元素的值为:%d\n",e);
    position = LocateElem(L,10,compare);
    printf("元素10的position是:%d\n",position);
    i = ListDelete(&L,8,&e);
    printf("现在的表属性为:L.elem = %u,L.length = %d,L.listsize = %d\n",L.elem,L.length,L.listsize);
    printf("删除第8个元素后:遍历顺序表的结果为:\n");
    i = ListTraverse(L,visit);
}

抱歉!评论已关闭.