一、线性表基本概念
1、线性表的定义和表示方法
- 线性表的定义
— 线性表就是零个或多个相同数据元素的有限序列。
- 线性表的表示方法
2、线性表的基本运算 -1
(1) 建立一个空表:CreateList(L);
(2) 置空表:ClearList(L);
(3) 判断表是否为空:EmptyList(L); ----- 若为空,返回值为True(或1) ,否则 返回False(或0)
(4) 求表长:Length(L);
(5) 取表中某个元素:GetList(L,i); ------ 即 a[i].
3、线性表的基本运算 -2
(6) 定位运算:Locate(L,x)。确定元素x在表L中的位置。
(7) 插入:Insert(L,x,i) 。将元素x插入到表L中第i个元素a[i]之前,且表厂+1.
(8) 删除:Delete(L,i) 。删除表L中第i个元素,且表长减1 ,要求0≤i≤n-。
运算(1)~(8)是对线性表L施加的一些基本运算,对线性表L的运算还有合并、拆分、复制、排序和遍历等。
二、线性表的顺序存储结构的编程实现(顺序表)
1、线性表的顺序存储结构
- 线性表作为i一种基本的数据结构类型,在计算机存储器中的映像(或表示)一般又两种形式,一种是顺序映像,一种是链式映像。
- 若将线性表L=(a0、a1、........,an-1)中的各元素依次存储与计算机一片连续的存储空间,如图所示。这种机内表示为线性表的顺序存储结构。
2、顺序存储的特点
- 顺序存储的特点:
— (1) 逻辑上相邻的元素ai,ai+1,其存储位置也是相邻的。
— (2) 对数据元素ai的存取为随机存取或按地址存取。
— (3) 存储密度高。存储密度D=(数据结构中元素所占存储空间)/(整个数据结构所占空间)。
- 顺序存储结构的不足
— 对表的插入和删除等运算的时间复杂度较差。
3、顺序存储的实现
- 在C语言中,一维数组的元素也是存放于一片连续的存储空间中,故可借助于C语言中一维数组类型来 描述线性表的顺序存储结构。
- seqlink.h
函数名书写规则:1、字母连起来,且第一个字母大写 2、每个字母直接用下划线连起来(不用大写)
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
typedef int data_t;
#define Maxnum 100
typedef struct node{
data_t data[Maxnum];
int last;
}seqlist;
extern seqlist * list_create(void);
extern void clear_seqlist(seqlist * L);
extern int is_empty_seqlist(seqlist * L);
extern int is_full_seqlist(seqlist * L);
extern int get_length_seqlist(seqlist * L);
extern void show_seqlist(seqlist * L);
extern int insert_seqlist(seqlist * L,data_t x,int pos);
extern int delete_seqlist(seqlist * L,int pos);
extern int change_seqlist(seqlist * L,data_t x,int pos);
extern int search_seqlist(seqlist * L,data_t x);
#endif
- seqlink.c
— 插入一个数据,数组最后的那位数据开始向后移动,接着向前一个一个的数据向后移动一位
#include <stdio.h>
#include <stdlib.h>
#include "seqlist.h"
seqlist * list_create(void)
{
seqlist * p;
p = (seqlist*)malloc(sizeof(seqlist));
if(p == NULL)
{
printf("Malloc faile !!");
return NULL;
}
p->last = -1;
return p;
}
void clear_seqlist(seqlist * L)
{
if(L == NULL)
{
printf("Seqlist is NULL !!");
return;
}
free(L);
return;
}
int is_empty_seqlist(seqlist * L)
{
if(L==NULL)
{
printf("Seqlist is NULL !");
return -1;
}
return (L->last == -1);
}
int is_full_seqlist(seqlist * L)
{
if(L == NULL)
{
printf("Seqlist is NULL !!");
return -1;
}
return (L->last == Maxnum-1);
}
int get_length_seqlist(seqlist * L);
void show_seqlist(seqlist * L)
{
int i;
if(L == NULL)
{
printf("Seqlist is NULL !");
return ;
}
for(i=0;i<=L->last;i++)
{
printf("L->data[%d]= %d ",i,L->data[i]);
}
printf("\n");
return;
}
int insert_seqlist(seqlist * L,data_t x,int pos)
{
int i;
if((is_full_seqlist(L))||(pos<0)||(L==NULL))
{
printf("Seqlist is input faile !!");
return -1;
}
for(i=L->last;i>=pos;i--)
{
L->data[i+1] = L->data[i];
}
L->data[pos] = x;
L->last++;
return 0;
}
int delete_seqlist(seqlist * L,int pos)
{
int i;
int q;
if((is_empty_seqlist(L))||L==NULL||pos<0)
{
printf("Seqlist delete faile !!");
return -1;
}
q = L->data[pos];
for(i=pos;i<=L->last;i++)
{
L->data[i] = L->data[i+1];
}
L->data[i] = 0;
L->last--;
return q;
}
int change_seqlist(seqlist * L,data_t x,int pos);
int search_seqlist(seqlist * L,data_t x);
- Makefile文件:
CC=gcc
CFLAGS=-O0 -g -Wall
test:test.c seqlist.c
$(CC) $(CFLAGS) -o $@ $^
.PHONY:clean
clean:
rm -rf test
- test.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "seqlist.h"
int main(int argc, const char *argv[])
{
seqlist * q;
int n1,n2,n3;
n1 = 1;
n2 = 3;
n3 = 4;
q = list_create();
if(q == NULL)
{
printf("Seqlist Create faile !");
return -1;
}
printf("P->LAST = %d \n",q->last);
insert_seqlist(q,n1,0);
insert_seqlist(q,n2,1);
insert_seqlist(q,n3,2);
show_seqlist(q);
printf("p->last = %d\n",q->last);
delete_seqlist(q,1);
show_seqlist(q);
return 0;
}