线性链表的顺序存储结构

                                                                                     线性表(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.线性表的长度变化较大,难以确定存储空间的容量




  
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值