线性表顺序存储
线性表的静态分配
cs
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int data_t;
#define N 100
typedef struct
{
data_t data[N];/* data */
int length;
}sqlist,*sqlink;
sqlink list_creat()
{
sqlink L;
L=(sqlink)malloc(sizeof(sqlist));
if(L==NULL)
{printf("list malloc failed");
return L;}
memset(L,0,sizeof(sqlist));
L->length=0;
return L;
}
int list_clear(sqlink L)
{
if(L=NULL)
return -1;
memset(L,0,sizeof(sqlist));
L->length=0;
return 0;
}
int list_insert(sqlink L, data_t value, int pos) {
int i;
//full
if (L->length == N) {
printf("list is full\n");
return -1;
}
//check para 0<=pos<=Last+1 [0, last+1]
if (pos < 0 || pos > L->length) {
printf("Pos is invalid\n");
return -1;
}
//move
for (i = L->length-1; i >= pos; i--) {
L->data[i+1] = L->data[i];
}
//update value
L->data[pos] = value;
L->length++;
}
int main()
{
sqlink L;
L=list_creat();
}
特点:分配内存固定,容易存在溢出或内存浪费问题
动态分配
cs
#include <stdio.h>
#include <stdlib.h>
// 动态分配顺序表结构定义
#define InitSize 10 // 初始长度
typedef int ElemType;
typedef struct
{
ElemType *data; /* data */
int length;
int Maxsize;
}sqlist,*sqlink;
void Initlist(sqlink L)
{
L->data=(ElemType*)malloc(sizeof(sqlist));
L->length=0;
L->Maxsize=InitSize;
}
void IncreaseSize(sqlink L,int len)
{
ElemType *p=L->data;
L->data=(ElemType)malloc((L->Maxsize+len) *sizeof(ElemType));
for(int i=0;i<L->length;i++){
L->data[i]=p[i];
}
L->Maxsize=L->Maxsize+len;
free(p);
}
特点:数据的存储地址在结构体外面,通过结构体成员指针指向数据存放内存的初始地址,可随时申请更大的内存空间来存放数据
线性表的顺序存储缺点
线性表的顺序存储结构有存储密度高及能够随机存取等优点,但存在以下不足:
(1)要求系统提供一片较大的连续存储空间。
(2)插入、删除等运算耗时,且存在元素在存储器中成片移动的现象
线性表链式存储
cs
#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct node
{
data_t data;
struct node* next;
}LNode,* Linklist;
void InitList(Linklist L){
L=(Linklist*)malloc(sizeof(LNode));
L->next=NULL;
}