/* 课本参考:数据结构(C语言版)-严蔚敏
一、线性表的顺序表示
1)、线性表的顺序表示就是用一组地址连续的存储单元依次存储线性表的数据元素。
2)、对于线性表 a1 ,a2,…ai…,an 如果每个元素占用s个存储单元, 则ai+1的位置为: LOC(ai+1)=LOC(ai)+s
LOC(ai+1)=LOC(a1)+(i-1)*s (存储结构示意图P22)
二、线性表的实现
1、动态分配顺序存储结构
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem
int length
int listsize
}SqList
2、基本操作 1)构造一个空表(P23)
2)插入算法(P24)
3)删除算法(P24)
4)算法的复杂性分析(P25)
*/
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR 0
//----线性表动态分配顺序存储结构----
#define LIST_INIT_SIZE 10 //线性表存储空间初始分配量
#define LISTINCRMENT 10 //线性表存储空间分配增量
typedef struct {
ElemType *elem; //存储空间基值
int length; //当前长度
int listsize; //当前存储容量
}SqList;
Status InitList_Sq(SqList &L) {
//构造一个空的线性表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//动态分配内存
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){
ElemType *newbase;
ElemType *p,*q;
//在顺序线性表L中的第i个位置之前插入新元素e。
//i的合法值1<<i<<L.length+1
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize) {
newbase =(ElemType*)realloc(L.elem,(L.listsize+LISTINCRMENT)*sizeof(ElemType));
if(!newbase) exit(ERROR);
L.elem=newbase;
L.listsize+=LISTINCRMENT;
}
q=&(L.elem[i-1]); //q为插入的地方;
for(p=&(L.elem[L.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType e) {
ElemType *p,*q;
//在顺序表中删除第i元素,并e返回其值
if((i<1)||(i>L.length)) return ERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--L.length;
return OK;
}
void Print(SqList &L) {
for(int i=0;i<L.length;i++)
{
printf("%4d",L.elem[i]);
}
printf(" 线性表长:%d\n",L.length);
printf("\n");
}
void main() {
ElemType e;
SqList L;
InitList_Sq(L);
printf("初始化数据:\n");
for(int i=0;i<9;i++)
{
L.elem[i]=i;
L.length++;
}
Print(L);
ListInsert_Sq(L,5,100);
ListInsert_Sq(L,9,90);
ListInsert_Sq(L,9,88);
Print(L);
ListDelete_Sq(L,1,e);
Print(L);
}
/* 课本参考:数据结构(C语言版)-严蔚敏
一、线性表的顺序表示
1)、线性表的顺序表示就是用一组地址连续的存储单元依次存储线性表的数据元素。
2)、对于线性表 a1 ,a2,…ai…,an 如果每个元素占用s个存储单元, 则ai+1的位置为: LOC(ai+1)=LOC(ai)+s
LOC(ai+1)=LOC(a1)+(i-1)*s (存储结构示意图P22)
1、动态分配顺序存储结构
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType *elem
int length
int listsize
}SqList
2、基本操作 1)构造一个空表(P23)
2)插入算法(P24)
3)删除算法(P24)
4)算法的复杂性分析(P25)
*/
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
#define OK 1
#define ERROR 0
//----线性表动态分配顺序存储结构----
#define LIST_INIT_SIZE 10 //线性表存储空间初始分配量
#define LISTINCRMENT 10 //线性表存储空间分配增量
typedef struct {
ElemType *elem; //存储空间基值
int length; //当前长度
int listsize; //当前存储容量
}SqList;
Status InitList_Sq(SqList &L) {
//构造一个空的线性表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//动态分配内存
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e){
ElemType *newbase;
ElemType *p,*q;
//在顺序线性表L中的第i个位置之前插入新元素e。
//i的合法值1<<i<<L.length+1
if(i<1||i>L.length+1) return ERROR;
if(L.length>=L.listsize) {
newbase =(ElemType*)realloc(L.elem,(L.listsize+LISTINCRMENT)*sizeof(ElemType));
if(!newbase) exit(ERROR);
L.elem=newbase;
L.listsize+=LISTINCRMENT;
}
q=&(L.elem[i-1]); //q为插入的地方;
for(p=&(L.elem[L.length-1]);p>=q;--p)
{
*(p+1)=*p;
}
*q=e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType e) {
ElemType *p,*q;
//在顺序表中删除第i元素,并e返回其值
if((i<1)||(i>L.length)) return ERROR;
p=&(L.elem[i-1]);
e=*p;
q=L.elem+L.length-1;
for(++p;p<=q;++p)
{
*(p-1)=*p;
}
--L.length;
return OK;
}
void Print(SqList &L) {
for(int i=0;i<L.length;i++)
{
printf("%4d",L.elem[i]);
}
printf(" 线性表长:%d\n",L.length);
printf("\n");
}
void main() {
ElemType e;
SqList L;
InitList_Sq(L);
printf("初始化数据:\n");
for(int i=0;i<9;i++)
{
L.elem[i]=i;
L.length++;
}
Print(L);
ListInsert_Sq(L,5,100);
ListInsert_Sq(L,9,90);
ListInsert_Sq(L,9,88);
Print(L);
ListDelete_Sq(L,1,e);
Print(L);
}