线性表顺序存储结构的表达与实现

#include<stdio.h>
#include<stdlib.h>

#define LIST_INIT_SIZE 10
#define LISTINCREMENT 5

typedef int ElemType;

struct SqList{
	ElemType *elem;
	int length;
	int listsize;
};

//初始化线性表
void InitList_Sq(SqList &L){
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
	if(!L.elem){
		printf("ERROR in InitList_Sq\n");
		return;
	}
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
}

//销毁线性表
void DestoryList(SqList &L){
	free(L.elem);
	L.length = 0;
} 

//清空线性表
void ClearList(SqList &L){
	L.length = 0;
} 

//判断线性表是否为空
int ListEmpty(SqList L){
	return (L.length==0) ? 1 : 0
} 

//返回线性表的长度
int ListLength(SqList L){
	return L.length;
} 

//获取线性表中第i个元素
void GetElem(SqList L, int i, ElemType &e){
	if(i<1||i>L.length){
		printf("OVERFLOW in GetElem\n");
		return;
	}
	e = L.elem[i-1];
}

//向线性表插入元素
void InsertList_Sq(SqList &L, int i, ElemType e){
	if(i<1||i>L.length+1){                        //这里应该是i>L.length+1,在编写过程中在这里踩过坑
		printf("OVERFLOW in InsertList_Sq\n");
		return;
	}
	if(L.length>=L.listsize){
		ElemType *temp;
		temp = (ElemType *)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(ElemType));//这个部分也应该留意L.listsize+LISTINCREMENT
		if(!temp){
			printf("ERROR in InsertList_Sq\n");
			return ;
		}
		L.elem = temp;
		L.listsize += LISTINCREMENT;
	}
	
	ElemType *ptr, *ptr_last;
	ptr = &(L.elem[i-1]);
	ptr_last = &(L.elem[L.length-1]);//这里和下面的DeleteList_Sq的部分分别为两种取地址的方式,可以灵活使用
	for(ptr_last; ptr_last>=ptr; --ptr_last) *(ptr_last+1) = *(ptr_last);
	*ptr = e;
	++L.length;
}

void DeleteList_Sq(SqList &L, int i, ElemType &e){
	if(i<1||i>L.length){
		printf("OVERFLOW in DeleteList_Sq\n");
		return;
	}
	
	ElemType *ptr, *ptr_last;
	e = L.elem[i-1];
	ptr = &(L.elem[i-1]);
	ptr_last = L.elem+L.length-1;
	for(ptr; ptr<ptr_last; ptr++) *ptr = *(ptr+1);
	L.length--;
}

int main(){
	SqList list;
	int e;
	InitList_Sq(list);
	
	for(int i=1; i<=9; i++){
		InsertList_Sq(list, i, i);
	}
	InsertList_Sq(list, 26, 0);
	InsertList_Sq(list, 5, -1);
	for(int i=0; i<list.length; i++){
		printf("%d ", list.elem[i]);
	}
	printf("\n");
	DeleteList_Sq(list, 13, e);
	printf("%d\n", e); 
	for(int i=0; i<list.length; i++){
		printf("%d ", list.elem[i]);
	}
	
	
	
	return 0;
}

参考:严蔚敏《数据结构C语言版》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值