线性表(List)
线性表 是数据元素的有序的并且有限的集合,线性表中的数据元素必须是同种类型的;
线性表的常用操作:
1.创建线性表 List* List_Creat()
2.销毁线性表 void Llist_Destroy(List* list)
3.清空
线性表 void Llist_Clear(List* list)
4.将元素插入线性表 int List_Insert(List* list, ListNode* node, int pos);
5.将元素从线性表删除 ListNode* List_Delete(List* list, int pos);
6.获取线性表中某个位置的元素 ListNode* List_Get(List* list, int pos)
7.获取线性表的长度 int List_length(int length)
顺序存储结构:
在C语言中可以使用一维数组来实现顺序存储结构
一.
存储空间的起始位置:数组node
线性表的最大容量:MAXSIZE
线性表的当前长度: length
#define MAXSIZE 20
typedef struct _tag_list_
{
char node[MAXSIZE];
int length
}List
二.获取元素操作
1.判断线性表是否合法
2.判断位置是否合法
3.直接通过数组下表的方式获取元素
char get(List* list , int pos)
{
char ret=-1;
//1.判断线性表是否合法
//2.判断位置是否合法
if((list!=NULL)&&(pos=>0)&&(pos<list->length))
{
//3.获取元素
ret=list->node[pos];
}
return ret;
}
三:顺序存储结构算法
1.插入元素
1.判断线性表是否合法
2.判断插入的位置是否合法
3.把最后一个元素到插入位置的元素后移一个位置
4.将新元素插入
5.线性表的长度加1
int Insert(List *list,char c , int pos)
{
/*1.判断线性表是否合法*/
int ret=(list!=NULL);
int i=0;
/*2.判断位置是否合法*/
ret=ret&&(list->length+1 > MAXSIZE);
ret=ret&&(pos>0)
if(ret)
{
if(pos >= list->length)
{
pos=list->length;
}
/*3.从最后一个元素开始到pos位置,分别将他们向后移动一个位置*/
for(int i=list->length;i>pos;i--)
{
list->node[i] = list->node[i-1];
}
/*4.将新元素插入*/
list->node[pos]=c;
list->length++;
}
return ret;
}
2.删除元素
1.判断线性表是否合法
2.判断插入的位置是否合法
3.将元素取出
4.把最后一个元素到删除元素的位置的前移一个位置
5.线性表的长度减1
int Delete(List *list ,int pos)
{
int ret=-1;
int i=0;
/*1.判断线性表是否合法*/
ret=ret&&(list!=NULL);
/*2.判段删除的位置是否合法*/
ret=ret&*&(pos>=0)&&(pos->length);
if(ret)
{
/*3.将元素取出*/
ret=list->node[pos];
/*4.把删除位置pos,后的元素向前移动一个位置*/
for(i=pos+1;i<list->length;i++)
{
list->node[i-1] = list->node[i];
}
/*5.线性表的长度减1*/
list->length--;
}
return ret;
}
四.可复用的顺序线性表
sellist.c文件
#include<stdio.h>
#include<malloc.h>
#include"seqlist.h"
/*用于存放数据元素的地址*/
typedef unsigned int TSeqlistNode; //在32位计算机中一个地址是四个字节,32位
typedef struct _tag_Seqlist
{
int capacity; //表明线性表的最大容量
int length; //表明线性表的长度
TSeqlistNode* node;
}TSeqlist;
/*创建一个最大容量为capacity的线性表*/
SeqList* SeqList_Creat(int capacity)
{
TSeqlist* ret = NULL;
if (capacity>= 0)
{
ret = (TSeqlist*)malloc(sizeof(TSeqlist) + sizeof(TSeqlistNode)*capacity);
}
if (ret != NULL)
{
ret->capacity = capacity;
ret->length = 0;
ret->node = (TSeqlistNode*)(ret + 1);
}
return ret;
}
void SeqList_Destory(SeqList* list)
{
free(list);
}
void SeqList_Clear(SeqList* list)
{
TSeqlist* slist = (TSeqlist*)list;
if (slist != NULL)
{
slist->length = 0;
}
}
int SeqList_Length(SeqList* list)
{
TSeqlist* slist = (TSeqlist*)list;
int ret = -1; //线性表里没有负数
if (slist != NULL)
{
ret = slist->length;
}
return ret;
}
int SeqList_Capacity(SeqList* list)
{
TSeqlist* slist = (TSeqlist*)list;
int ret = -1; //线性表里没有负数
if (slist != NULL)
{
ret = slist->capacity;
}
return ret;
}
int SeqList_Insert(SeqList* list, ListNode* node, int pos)
{
TSeqlist* slist = (TSeqlist*)list;
int ret = (slist!=NULL);
int i = 0;
ret = ret && (slist->length + 1 <=slist->capacity);
ret = ret && (pos >= 0);
if (ret)
{
if (pos > slist->length)
{
pos = slist->length;
}
for (i = slist->length; i > pos; i--)
{
slist->node[i] = slist->node[i - 1];
}
slist->node[i] = (TSeqlistNode)node;
slist->length++;
}
return ret;
}
ListNode* SeqList_Get(SeqList* list, int pos)
{
TSeqlist* slist = (TSeqlist*)list;
ListNode* ret = NULL;
if ((slist != NULL) && (0 <= pos) && (pos <slist->capacity))
{
ret = (ListNode*)(slist->node[pos]);
}
return ret;
}
ListNode* SeqList_Delete(SeqList* list, int pos)
{
TSeqlist* slist = (TSeqlist*)list;
ListNode* ret = SeqList_Get(list,pos);
int i = 0;
if (ret != NULL)
{
for (i = pos + 1; i<slist->length; i++)
{
slist->node[i - 1] = slist->node[i];
}
slist->length--;
}
return ret;
}
seqlist.h
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef void SeqList;
typedef void ListNode;
SeqList* SeqList_Creat(int capacitv);
void SeqList_Destory(SeqList* list);
void SeqList_Clear(SeqList* list);
int SeqList_Capacity(SeqList* List);
int SeqList_Insert(SeqList* list, ListNode* node, int pos);
ListNode* SeqList_Delete(SeqList* list, int pos);
ListNode* SeqList_Get(SeqList* list, int pos);
int SeqList_Length(SeqList* list);
#endif
main.c
#include<stdio.h>
#include"seqlist.h"
int main()
{
SeqList* list = SeqList_Creat(5);
int i = 0;
int j = 1;
int k = 2;
int x = 3;
int y = 4;
int z = 5;
int index = 0;
SeqList_Insert(list,&i,0);
SeqList_Insert(list,&j,0);
SeqList_Insert(list,&k,0);
SeqList_Insert(list,&x,0);
SeqList_Insert(list,&y,0);
SeqList_Insert(list,&z, 0);
for (index = 0; index < SeqList_Length(list); index++)
{
int* p = (int *)SeqList_Get(list,index);
printf("%d\n", *p);
}
printf("\n");
while (SeqList_Length(list) > 0)
{
int *p =(int*) SeqList_Delete(list,0);
printf("%d\n", *p);
}
SeqList_Destory(list);
return 0;
}
五:顺序存储结构的优点以及缺点
优点:
1.无需为线性表的逻辑关系增加额外的空间
2.可以快速的获取表中合法位置的元素
缺点:
1.当出入或者删除元素时需要移动大量的数据
2.线性表的长度变化较大,难以确定存储空间的容量