數據結構——順序表

順序表:採用順序存儲方式的線性表稱爲順序表數組

順序存儲結構:指的是用一段地址連續的存儲單元依次存儲線性表的數據元素,因爲是依次存放的,所以只要知道順序表的首地址及數據元素所佔的存儲長度,就容易計算出任何一個元素的位置code

(1)定義順序表的結構string

#include <stdio.h>
#include <string.h>

#define MAXSIZE 100 //定義順序表最大長度


typedef struct { //定義數據類型
    char key[15];
    char name[20];
    int age;
} DATA;

typedef struct {
    DATA ListData[MAXSIZE+1]; //保存順序表數組
    int ListLen; //順序表已存節點的數量
} SeqListType;

(2)定義順序表操做it

void SeqListInit(SeqListType *SL); //初始化順序表
int SeqListLength(SeqListType *SL); //返回順序表的元素數量
int SeqListAdd(SeqListType *SL, DATA data); //向順序表中添加元素
int SeqListInsert(SeqListType *SL, int n, DATA data); //向順序表中插入元素
int SeqListDelete(SeqListType *SL, int n); //刪除順序表中的數據元素
DATA *SeqListFindByNum(SeqListType *SL, int n); //根據序號返回元素
int SeqListFindByKey(SeqListType *SL, char *key); //按關鍵字查找
int SeqListAll(SeqListType *SL); //遍歷順序表的內容

(3)順序表操做io

/*
 *初始化順序表
 * */
void SeqListInit(SeqListType *SL)
{
    SL->ListLen = 0; //設置順序表長度爲0
}

/*
 *返回順序表的元素數量
 * */
int SeqListLength(SeqListType *SL)
{
    return (SL->ListLen);
}

/*
 *向順序表中添加元素
 * */
int SeqListAdd(SeqListType *SL, DATA data)
{
    if (SL->ListLen >= MAXSIZE) {
        printf("順序表已滿,不能再添加節點!\n");
        return 0;
    }

    SL->ListData[++SL->ListLen] = data;
    return 1;
}

/*
 *向順序表中插入元素
 * */
int SeqListInsert(SeqListType *SL, int n, DATA data)
{
    int i;
    if (SL->ListLen >= MAXSIZE) {
        printf("順序表已滿,不能再添加節點!\n");
        return 0;
    }

    if (n<1 || n>SL->ListLen-1) {
        printf("插入節點序號錯誤,不能插入元素!\n");
        return 0;
    }

    for (i=SL->ListLen; i>=n; i--) {
        SL->ListData[i+1] = SL->ListData[i];
    }   

    SL->ListData[n] = data;
    SL->ListLen++;

    return 1;
}

/*
 *刪除順序表中的數據元素
 * */
int SeqListDelete(SeqListType *SL, int n)
{
    int i;

    if (n<1 || n>SL->ListLen+1) {
        printf("刪除節點序號錯誤,不能刪除節點!\n");
        return 0;
    }

    for (i=n; i<SL->ListLen; i++) {
        SL->ListData[i] = SL->ListData[i+1];
    }

    SL->ListLen--;
    
    return 1;
}

/*
 *根據序號返回元素
 * */
DATA *SeqListFindByNum(SeqListType *SL, int n)
{
    if (n<1 || n>SL->ListLen+1) {
        printf("節點序號錯誤,不能返回節點!\n");
        return NULL;
    }   

    return &(SL->ListData[n]);

}

/*
 *按關鍵字查找
 * */
int SeqListFindByKey(SeqListType *SL, char *key)
{
    int i;

    for (i=1; i<=SL->ListLen; i++) {
        if (strcmp(SL->ListData[i].key, key) == 0) 
            return i;
    }

    return 0;
}

/*
 *遍歷順序表的內容
 * */
int SeqListAll(SeqListType *SL)
{
    int i;

    for (i=1; i<=SL->ListLen; i++) {
        printf("(%s,%s,%d)\n", SL->ListData[i].key, SL->ListData[i].name, SL->ListData[i].age);
    } 

}
相關文章
相關標籤/搜索