数据结构线性表——顺序表


前言(优缺点)

线性顺序存储缺点:
线性表的顺序存储结构有存储密度高及能够随机存取等优点但存在以下不足
1.要求系统提供一片较大连续的空间
2.插入删除运算等耗时,且存在元素在存储器中成片的移动
提示:以下是本篇文章正文内容,下面案例可供参考

一、线性表的定义和基本操作

线性表的定义

线性表定义: 具有相同数据类型的n(N>=0)个数据元素的有限序列。

线性表的特点

                  1.除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继
                  2.表中元素个数有限
                  3.表中元素具有逻辑上的顺序关系
                  4.表中每个元素都是数据元素,每个元素都是单个元素
                  5.表中元素的数据类型都相同,即每个元素占有相同大小的存储空间
                  6.表中元素具有抽象性,即只关注与逻辑结构,不关注于元素表示的内容
                  7.线性表示一种逻辑结构 ,表示元素之间一对一的相邻关系;顺序表和链表是存储结构,表示物理结构

基本操作

			list_create(L):建立一个空表
            Length(L):求表长
            list_clear(L):置空表
            list_empty(L) :判断是否为空,若表空,返回值为1,否则返回0
            getlist(L,I):去表中某个元素
            locate(L,X):确定元素x在表中位置
            insert(L,x,i):将元素x插入到表L中第i个元素,表长+1
            delete(L,i):删除L表中底个元素,且表长-1

二、代码演示基本操作

搭建一个顺序表框架代码

代码如下(示例):
sqlist.h

/*
typedef int data_t;
#define N 128
 
struct sqlist_t {
    data_t data[N];
    int last;
};
 
typedef struct sqlist_t sqlist;//sqlist L; struct sqlist_t L;
typedef struct sqlist_t * sqlink;// struct sqlist_t * p; sqlink p;
*/
 
typedef int data_t;
#define N 128 
 
typedef struct {
    data_t data[N];
    int last;
}sqlist, *sqlink;
 
sqlink list_create();
int list_clear(sqlink L);
int list_delete(sqlink L);
int list_empty(sqlink L);
int list_length(sqlink L);
int list_locate(sqlink L, data_t value);
int list_insert(sqlink L, data_t value, int pos);
int list_show(sqlink L);

sqlist.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlist.h"
 
sqlink list_create() {
    //malloc
    sqlink L;
 
    L =(sqlink)malloc(sizeof(sqlist));
    if (L == NULL) {
        printf("list malloc failed\n");
        return L;
    }
 
    //initialize
    memset(L, 0, sizeof(sqlist));
    L->last = -1;
 
    //return
    return L;
}
 
/*
 * @ret   0-success   -1-failed
 * */
int list_clear(sqlink L) {
    if (L == NULL)
        return -1;
 
    memset(L, 0, sizeof(sqlist));
    L->last = -1;
 
    return 0;
}
 
int list_delete(sqlink L){
    if (L == NULL) 
        return -1;
    free(L);
    L = NULL;
    return 0;
}
 
/*
 * list_empty: Is list empty?
 * para L: list
 * @ret  1--empty   0--not empty
 * */
int list_empty(sqlink L) {
    if (L->last == -1) 
        return 1;
    else
        return 0;
}
 
int list_length(sqlink L) {
    if (L == NULL) 
        return -1;
    return (L->last+1);
}
 
int list_locate(sqlink L, data_t value) {
 
    return 0;
}
 
int list_insert(sqlink L, data_t value, int pos) {
    int i;
 
    //full
    if (L->last == N-1) {
        printf("list is full\n");
        return -1;
    }
 
    //check para    0<=pos<=Last+1   [0, last+1]
    if (pos < 0 || pos > L->last+1) {
        printf("Pos is invalid\n");
        return -1;
    }
 
    //move
    for (i = L->last; i >= pos; i--) {
        L->data[i+1] = L->data[i];
    }
 
    //update value last
    L->data[pos] = value;
    L->last++;
 
    return 0;
}
 
int list_show(sqlink L) {
    int i;
 
    if (L == NULL) 
        return -1;
    if (L->last == -1)
        printf("list is empty\n");
 
    for (i = 0; i <= L->last; i++) {
        printf("%d ", L->data[i]);
    }
    puts("");
 
    return 0;
}

test.c

#include <stdio.h>
#include "sqlist.h"
 
void test_insert();
 
int main(int argc, const char *argv[])
{
    test_insert();
 
    return 0;
}
 
void test_insert() {
    sqlink L;
     
    L = list_create();
    if (L == NULL) 
        return;
 
    list_insert(L, 10, 0);
    list_insert(L, 20, 0);
    list_insert(L, 30, 0);
    list_insert(L, 40, 0);
    list_insert(L, 50, 0);
    list_insert(L, 60, 0);
 
    list_show(L);
    //list_insert(L, 100, list_length(L));
    list_insert(L, 100, -1000);
    list_show(L);
    list_delete(L);
}

去除线性表中的重复元素

代码如下(示例):
(例如:1、1、1、6、3、4、4、9、6,去重之后为1、3、4、9、6)

int list_merge(sqlink L1, sqlink L2) {
    int i = 0;
    int ret;
 
    while (i <= L2->last){
        ret = list_locate(L1, L2->data[i]);
        if (ret == -1) {
            if (list_insert(L1, L2->data[i], L1->last+1) == -1) 
                return -1;
        }
 
        i++;
    }
    return 0;
}

为线性表的合并La = La U Lb

代码如下(示例):
(例如:La:1、2、3、4;Lb:4、5、6、7;合并之后La:1、2、3、4,、5、6、7;Lb:4、5、6、7);

int list_purge(sqlink L) {
    int i;
    int j;
 
    if (L->last == 0)
        return 0;
 
    i = 1;
    while (i <= L->last) {
        j = i-1;
        while (j >= 0) {
            if (L->data[i] == L->data[j]) {
                list_delete(L, i);
                break;
            } else {
                j--;
            }
        }
 
        if ( j < 0) {
            i++;
        }
    }
 
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值