【C语言】【数据结构】线性表-顺序表的完整实现

线性表依据存储方式分为顺序表和链表(链表包括单链表、双链表、循环链表),依据操作限制分为栈、队列。

顺序表,即是数据在内存中占据连续的内存单元,方便访问成员,但是删除和插入操作不便。

定义数据

#define LIST_INIT_SIZE 5
#define LIST_INCREMENT 5

typedef int SeqType; //存储单元类型

typedef struct{
    SeqType *elem;  //存储空间基地址
    int length;     //当前长度
    int listsize;   //当前分配的存储容量(以sizeof(ElemType)为单位)
} SqList;

初始化顺序表

/**
 * 初始化顺序表,分配LIST_INIT_SIZE*int大小的内存空间 
 * 初始化实际长度和当前分配长度 
 */

int initList_sq(SqList *L) {
	L->elem = (SeqType *) malloc(sizeof(SeqType) * LIST_INIT_SIZE);
    if (!L->elem)
        return 0;                 //内存分配失败,存储空间不够
    L->length = 0;                //表示顺序表为空
    L->listsize = LIST_INIT_SIZE; //表示顺序表里,最大存储单元个数
    
    return 1;  
}

插入操作

/**
 * 插入顺序表
 * 下标是负数就插入到结尾,下标大于实际长度则默认追加到末尾,长度不够则添加内存 
 * 第一个形参为结构体指针,第二个为插入元素位置,第三个为插入的值 
 */
int insertList_sq(SqList *L,int index,SeqType val) {
	if (L->length == L->listsize) { //顺序表的存储单元已经存满
        printf("顺序表的存储单元已满,继续分配新的存储单元。\n");
        SeqType* newBase = (SeqType*) realloc(L->elem,(L->listsize + LIST_INCREMENT) * sizeof(SeqType)); //继续分配存储单元
        if (!newBase) {
            printf("分配内存单元失败。\n");
            return 0;
        }
        L->elem = newBase;
        L->listsize += LIST_INCREMENT;
    }
		
	if (index < 0) //下标是负数,插入到结尾
        index = L->length;
    
    if (index > L->length) { //存储的下表超出顺序表实际的长度
        printf("插入的下标超出顺序表的实际长度,默认插入到表尾。\n");
        index = L->length;
    }
        
	//寻找合适的插入位置,index后面的元素向后移动
	int i = L->length;
    for (i;i>index;i--) {
        L->elem[i] = L->elem[i - 1]; //向后移动
    }
    L->elem[index] = val; //插入元素
    L->length++;

	return 1;
}

删除操作

/**
 * 输入参数为要删除的元素值,只删除第一个出现的值 
 */
int removeList_sq(SqList *L, SeqType val) {
    int index = -1; //记录匹配到的下标
    int i,tmp;
    for (i = 0; i < L->length; i++) {
        if (L->elem[i] == val) {
            //找到匹配的val,结束循环
            index = i;
            tmp = i;
            break;
        }
    }
    
    if (index < 0){
    	//printf("未找到该元素。\n"); 
		return -1;
	}
    
    for (; tmp < L->length - 1; tmp++) {
        L->elem[tmp] = L->elem[tmp + 1];
    }
    L->length--;
    return index+1;
}

查找操作

/**
 * 输入参数为要查找的元素值,只返回第一个出现的值在顺序表中的下标值 
 * 若返回值为-1则表示未找到 
 */
int findList_sq(SqList *L, SeqType val) {
    int i;
    for (i = 0; i < L->length; i++) {
        if (L->elem[i] == val) {
            return i;  
        }
    }
	return -1;
}

销毁操作

/**
 * 销毁顺序表
 */
void destoryList_sq(SqList *L) {
    free(L->elem); //释放存储空间
    L->length = 0;
    L->listsize = 0;
}

打印顺序表

//打印顺序表 
void display_sq(SqList *L){
	int i;
	for(i=0;i<L->length;i++)
		printf("[%d]:%d ",i,L->elem[i]);	
	printf("\n");	
}
附:开篇处下载链接需要3金币,如果实在需要又没有可以给我发邮件免费获取。实际上面的分步操作已经很完整了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值