前言(优缺点)
线性顺序存储缺点:
线性表的顺序存储结构有存储密度高及能够随机存取等优点但存在以下不足
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;
}

9040

被折叠的 条评论
为什么被折叠?



