赞
踩
线性表是我们学习数据结构的第一个结构,也是最常用且最简单的一种数据结构。一个线性表就是n个数据元素的有限序列。每个数据元素的具体含义,在不同的情况下是各不相同的,它可以是一个数或一个符号,也可以是一本书,甚至其他更复杂的信息。
在稍复杂的线性表中,一个数据元素可以由瑞干戈数据项组成。在这种情况下,常把数据元素称为记录,含有大量记录的线性表又称为文件。
线性表有以下特点:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素;(2)存在唯一的一个被称做“最后一个”的数据元素;(3)除第一个之外,集合中每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继。
线性表中元素的个数n(n>=0 )定义为线性表的长度,n=0时称为空表。在非空表中的每个数据元素都有一个确定的位置,如a1是第一个数据元素,an是最后一个数据元素,ai是第i个数据元素,称i为数据元素ai在线性表中的位序。
线性表是一个相当灵活的数据结构,它的长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,还可进行插入和删除等。
线性表第一个需要学习的就是初始化一个空的线性表。在构造之前我们需要写出头文件,预定义和定义类型和结构体。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//定义函数的返回码
#define OK 1
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
//定义类型和结构体
typedef int Status;//定义函数返回值类型
typedef int ElemType;//定义元素的类型
typedef struct
{
ElemType * elem;
int length;//线性表当前长度
int listsize;//线性表容量大小
}SqList;
//基本操作的实现
Status InitList_Sq(SqList &L)
{
//初始化一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem) return OVERFLOW;
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}//InitList_Sq
还有一些线性表的基本操作:
1、输出
Status PrintList(SqList L)
{
//线性表输出函数
if (L.length == 0)
{
printf("当前线性表为空\n");
return OK;
}
printf("当前线性表的元素为:\n");
for (int i = 0; i < L.length; i++)
printf("%d ", L.elem[i]);
printf("\n");
return OK;
}//PrintList
2、在顺序线性表L的第i个位置之前插入新的元素
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
//在顺序线性表L的第i个位置之前插入新的元素
ElemType *p, *q, *newbase;
if (i<1 || i>L.length + 1) return ERROR;
if (L.length >= L.listsize)//线性表已满,需要追加空间
{
newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newbase) return OVERFLOW;
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &L.elem[i - 1];
for (p = &L.elem[L.length - 1]; p > q; --p)
*(p + 1) = *p;
*q = e;
L.length += 1;
return OK;
}//ListInsert_Sq
3、
在顺序存储的线性表中删除第i个位置元素,并返回e的值
Status ListDelete_Sq(SqList &L, int i, ElemType &e)
{
//在顺序存储的线性表中删除第i个位置元素,并返回e的值
ElemType *p, *q;
if (i<1 || i>L.length) return ERROR;
q = &L.elem[i - 1];
e = *q;
p = L.elem + L.length - 1;
for (; p > q; q++)
*q = *(q + 1);
--L.length;
return OK;
}//ListDelete_Sq
以上就是线性表的部分内容,希望和大家共同学习,共同进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。