線性表-SqList(順序表)


知識點:

1:缺點

1)插入和刪除操作需要移動大量的元素
2)當線性表長度變化較大時,難以確定存儲空間的容量
3)任意造成存儲空間的碎片

2:優點

1)無須為表示表中元素之間的邏輯關系而增加額外的存儲空間。
2)可以快速的存取表中的任意位置的元素。

3:代碼中增加,刪除,是需要在原來線性表中進行,所以需要用到引用對原數據進行操作;不需要對原來數據進行的操作,我們直接對賦值后的局部變量(含有原線性表的所有數據)參數進行操作,即可

#include <stdio.h>
#include <stdlib.h>
#define initSize 20//順序表初始大小
typedef int elemType;

靜態存儲-(數組大小不變)

typedef struct
{
     elemType data[initSize];
     int length;//每增加一個數,length增加1
}

動態存儲-(動態分配存儲,以下代碼均為動態存儲)

typedef struct
{
    elemType* elem;//動態分配空間首地址
    int length;//線性表當前長
    int listSize;//線性表最大長

}sqList;

初始化

void initSqList(sqList *l)
{
    l->elem=(elemType *)malloc(initSize*sizeof(elemType));
    if(!l->elem)
    {
        printf("動態分配內存失敗\n");
        exit(0);
    }
    else
    {
        l->length=0;
        l->listSize=initSize;
    }
    printf("初始化成功\n");
}

銷毀

void destorySqList(sqList *l)
{
    if(l->elem)free(l->elem);//釋放空間
    l->elem=NULL;//指針指向空
    printf("銷毀成功\n");
}

清空

void clearSqList(sqList *l)
{
   l->length=0;
   printf("清空成功\n");
}

判空

int isEmptySqList(sqList l)
{
    if(l.length==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

求表長

//求表長
int getSqListLength(sqList l)
{
    return l.length;
}

按位置查找

elemType getSqListElem(sqList l,int i)
{
    if(i<1||i>l.length)
    {
        printf("位置不合法!\n");
        return 0;
    }
    else
    {
       printf("找到了:%d\n",l.elem[i-1]);
       return l.elem[i-1];
    }
}

按數據查找

elemType getSqListloc(sqList l,elemType e)
{
    int i,flag=1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==e)
        {
            flag=0;
            printf("所查元素位序為%d", i + 1);
            return i+1;
        }
    }
    if(flag)
    {
        printf("查詢無果");
        return 0;
    }

}

求前驅

elemType getSqListPre(sqList l,elemType cur_e,elemType *pre_e)
{
    int i,k=-1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==cur_e)
        {
            k=i-1;
            break;
        }
    }
    if(k>-1)
    {
        *pre_e=l.elem[k];
        printf("前驅元素為%d\n", *pre_e);
        return pre_e;
    }
    if(k=-1)
    {
        printf("查詢無果");
        return 0;
    }
}

求后繼

elemType getSqListNext(sqList l,elemType cur_e,elemType *next_e)
{
    int i,k=-1;
    for(i=0;i<l.length;i++)
    {
        if(l.elem[i]==cur_e)
        {
            k=i+1;
            break;
        }
    }
    if(k>-1)
    {
        *next_e=l.elem[k];
        printf("前驅元素為%d\n", *next_e);
        return next_e;
    }
    if(k==-1)
    {
        printf("查詢無果");
        return 0;
    }
}

末尾插入元素

void insertSqListLastElem(sqList *l,elemType e)
{
    int k=l->length;
    //不能大於順序表的當前儲存空間 否則開辟空間
    if(k>=l->listSize)
    {
        printf("順序表已滿!\n");//如果數組超出listSize,就動態的開辟同樣大小空間末尾分配加入
        l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType));
        if(!l->elem)
        {
            printf("分配空間失敗!\n");
            return 0;
        }
        l->listSize+=initSize;
    }
    l->elem[k+1]=e;
    l->length++;
}

指定位置插入元素

void insertSqListElem(sqList *l,int i,elemType e)
{
    int k;
    if(i<1||i>l->length+1)
    {
        printf("插入位置%d不合法!\n", i);
        return 0;
    }
    if(l->length>=l->listSize)
    {
        printf("順序表已滿!\n");//如果數組超出listSize,就動態的分配加入
        l->elem=(elemType *)realloc(l->elem,(l->listSize+initSize)*sizeof(elemType));
        if(!l->elem)
        {
            printf("分配空間失敗!\n", i);
            return 0;
        }
        l->listSize+=initSize;
    }
    for(k=l->length;k>i-1;k--)//i之后元素往后挪
    {
        l->elem[k]=l->elem[k-1];
    }
    l->elem[i-1]=e;
    l->length++;
}

末尾刪除

elemType deleteSqListLastElem(sqList* l)
{
    l->length--;
    return l->length;
}

指定位置刪除

elemType deleteSqListElem(sqList* l,int i,elemType* e)
{
    int k;
    if(i<1||i>l->length)
    {
        printf("刪除位置%d不合法\n", i);
        return 0;
    }
    *e=l->elem[i-1];
    for(k=i-1;k<l->length;k++)//i之后元素往前挪
    {
        l->elem[k]=l->elem[k+1];
    }
    l->length--;
    return *e;
}

遍歷輸出

void ListTraverse(sqList l)      //遍歷所有元素
{
    int i;
    if (isEmptySqList(l))
    {
        printf("順序表為空\n");
        return 0;
    }
    for (i = 0; i < l.length; i++)
        printf("%-5d", l.elem[i]);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM