//main.cpp
#include"seqlist.h"
int main()
{
seqlist* L = NULL;
int i = 0;
int *p = NULL;
L = creat_seqlist();
for (i = 0; i < 10; i++)
{
insert_seqlist(L, i, i*2);
}
show_seqlist(L);
print();
p=search_data_address(L,0);
printf("%#x\n",p);
printf("%#x\n",p+1);
printf("%#x\n",p+2);
system("pause");
return 0;
}
//seqlist.cpp
#include"seqlist.h"
seqlist* creat_seqlist(void)//创建一个线性表,函数类型为结构体指针,返回一个结构体的首地址
{
seqlist* L = NULL;//初始化链表指针,此时这个指针还没有指向具体的内存空间
L =(seqlist*)malloc(sizeof(seqlist));//创建一个线性表,此时L所指向的地址的大小为sizeof(seqlist),即404个字节
if (L == NULL)//判断是否创建成功
{
printf("seqlist init failed\n");
return NULL;
}
L->last = -1;//记录链表中元素个数
return L;//返回创建链表的首地址
}
int is_seqlist_empty(seqlist* L)//判断链表是否为空
{
if (L == NULL)
{
printf("seqlist is empty\n");
return -1;
}
return (L->last == -1);
}
int is_seqlist_full(seqlist* L)//判断链表是否溢出
{
if (L == NULL)
{
printf("seqlist is full\n");
return -1;
}
return ((L->last) == (MAX - 1));
}
int insert_seqlist(seqlist* L,int pos,int value)//链表中插入一个元素
{
if (is_seqlist_full(L) || pos<0 || pos>(L->last + 1))//判断插入的位置是否合理
{
printf("insert is failed\n");
return -1;
}
L->data[pos] = value;//数据元素赋值
L->last++;//记录元素个数
return 0;
}
int show_seqlist(seqlist* L)//遍历链表
{
int i = 0;
if(L==NULL)
{
printf("seqlist is NULL");
return -1;
}
for (i = 0; i <= L->last; i++)
{
printf("L->data[%d]=%d\n", i, L->data[i]);
}
return 1;
}
int del_seqlist(seqlist* L,int pos)//删除链表中的元素
{
int i = 0;
if (pos<0||pos>L->last)//判断是否在有效范围内删除元素
{
printf("seqlist not is del");
return -1;
}
for (i = pos; i < L->last; i++)
{
L->data[i] = L->data[i + 1];//后面的元素依次往前覆盖
}
L->last--;//元素个数减一
return 1;
}
int clear_seqlist(seqlist* L)//释放链表
{
if (L == NULL)
{
printf("seqlist is NULL");
return -1;
}
free(L);//不像单链表要逐个节点释放,一次性释放在创建线性表时申请的内存空间即可
return 1;
}
int get_seqlist_length(seqlist* L)//获取链表中元素个数
{
if (L == NULL)
{
printf("seqlist is NULL: ");
return -1;
}
return L->last + 1;//返回元素个数
}
int change_seqlist_value(seqlist* L,int pos,int value)//改变链表元素的值
{
if (L == NULL || pos<0 || pos>L->last + 1)
{
printf("seqlist is NULL");
return -1;
}
L->data[pos] = value;
return 1;
}
int search_seqlist(seqlist* L,int value)//寻找链表中是否存在值为value的元素,找到则并返回值所在的位置
{
int i = 0;
if (L == NULL)
{
printf("seqlist is NULL");
return -1;
}
for (i = 0; i <= L->last; i++)
{
if (L->data[i] == value)
return i;
}
return 0;
}
int* search_data_address(seqlist* L, int pos)//返回链表中特定元素所在地址
{
int* i = NULL;
if (L == NULL)
{
printf("seqlist is NULL");
return NULL;
}
i=&L->data[pos];
return i;
}
void print(void)
{
printf("\n");
}
//seqlist.h
#ifndef _seqlist_h
#define _seqlist_h
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<malloc.h>
#define MAX 100
typedef int datatype;
typedef struct list
{
datatype data[MAX];
datatype last;
}seqlist;
extern seqlist* creat_seqlist(void);
extern int is_seqlist_empty(seqlist* L);
extern int* search_data_address(seqlist* L, int pos);
extern int search_seqlist(seqlist* L, int value);
extern int change_seqlist_value(seqlist* L, int pos, int value);
extern int get_seqlist_length(seqlist* L);
extern int clear_seqlist(seqlist* L);
extern int del_seqlist(seqlist* L, int pos);
extern int show_seqlist(seqlist* L);
extern int insert_seqlist(seqlist* L, int pos, int value);
extern int is_seqlist_full(seqlist* L);
extern int is_seqlist_empty(seqlist* L);
extern void print(void);
#endif // _seqlist_h
注:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
插入元素的思路:
(1)判断插入位置是否合理,即先要判断表是否为满和插入的位置是否在表的范围内。如果不合理则抛出异常。
(2)从最后一个元素开始向前遍历到插入元素的位置,分别将它们往后移动一个位置。
(3)移动后表将空出一个位置,然后将要插入的元素填入该位置。
(4)表的长度加一
if(l->length==max||i<1||i>l->length+1)
{
return 0;
}
if(i<=l->length)
{
for(k=l->length-1;k>=i-1;k--)
{
l->data[k+1]=l->data[k];
}
}
l->data[i-1]=e;
l->length++;
删除元素的思路:
(1)判断删除位置是否合理。如果不合理则抛出异常。
(2)取出删除元素
(3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都往前移动一个位置
(4)表的长度减一
if(l->length==0||i<1||i>l->length)
{
return 0;
}
k=l->data[i-1];
if(i<l->length)
{
for(k=i;k<l->length;k++)
{
l->data[k-1]=l->data[k];
}
}
l->length--;
//线性表存储示意图
//数组元素下标地址计算方法
线性表:sequencelist
前驱元素,后继元素
元素之间是一对一关系
定义:零个或多个有序数据的集合(0个为空表)
1.描述线性表的顺序存储结构的三大属性:存储空间的起始位置,线性表的最大容量,线性表当前长度。
2.线性表顺序存储结构的定义:线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
3.线性表顺序存储结构的优点:
(1)无须为表示表中元素之间的逻辑关系而增加额外的存储空间
(2)可以快速地存取表中任意位置的元素
4:线性表顺序存储结构的缺点:
(1)插入和删除操作需要移动大量的元素
(2)当线性表长度变化较大时,难以确定存储空间的容量
(3)造成空间的“碎片”
顺序表的操作:operation
InitList(seqlist*)
insert_emelment(seqlist*,index,elem)
deletelement(seqlist*,index,elem)
getlength(seqlist)
isempty(seqlist*)
isfull(seqlist*)
clearlist(seqlist*)
getelement(seqlist*,index,)