线性表的顺序存储实现c语言

*线性结构的特点

在数据元素的非空有限集中:

1)存在唯一的一个被称做“第一个”的数据元素;

2)存在唯一的一个被称做“最后一个”的数据元素;

3)除第一个元素外,集合中的每个元素都只有一个前驱;

4)除最后一个元素外,集合中的每个元素都只有一个后继。

线性表的顺序存储指的是:

用一组地址连续的存储单元,依次存储线性表的基本元素。

参数使用指针,使用函数传入变量地址即&变量名,具体实现如下

/*
 ============================================================================
 Name        : SqList->c
 Author      : lingo
 Version     : 
 CreateDate  : 2018下午6:36:30
 Description : 线性表的顺序存储实现
 ============================================================================
 */
#include <stdio.h>
#include <malloc.h>  // malloc()
// 定义存储数据类型为int
#define ElemType int
//顺序线性表SqList的结构体定义
typedef struct{
	ElemType *elem;  // 指向存储数据的地址
	int length; // SqList的存储数据个数
	int size;   // SqList的最大存储空间
}SqList;
// 函数声明 声明函数的实现c中参数使用指针传递 sqList->elem = *sqList.elem
/*
 * 初始化线性表,sqListsize:初始化大小
 * */
int init(SqList *sqList,int sqListsize){
	// 创建 size*4 字节内存
	sqList->elem = (ElemType *)malloc(sqListsize*sizeof(ElemType));
	if(!sqList->elem){
		return -1;
	}else{
		sqList->length = 0;
		sqList->size = sqListsize;
	}
	return 0;
}
/*
 * 顺序将elem插入表尾
 * */
int insert(SqList *sqList,int elem)
{

	sqList->elem[sqList->length] = elem;
	printf("insert a num: %i\n",sqList->elem[sqList->length]);
	sqList->length++;
	return 0;
}
int getLength(SqList sqList){
	return sqList.length;
}
/**
 * 传入参数无需修改,可以直接传递变量,(&变量也可以)(不是不行但没必要哈哈哈!!) ---同学金典语录
 * 得到目的数据所在的索引即数组下标
 */
int locateElem(SqList sqList,int elem){
	for(int i = 0; i < sqList.length; i++){
		if(elem == sqList.elem[i]){
			return i;
			break;
		}
	}
	return -1;
}

/*
 * 删除指定值,并将索引后的元素前移
 * */
/* 返回值-1则删除失败*/
int delete(SqList *sqList,int index){
	if(index < 0 || index > sqList->length){
		return -1;
	}
	int tmp = sqList->elem[index];
	for(int j = index;j < sqList->length; j++) sqList->elem[j] = sqList->elem[j+1];
	return tmp;
}

/*
 * 释放线性表*elem所指内存空间
 * */
void clearSqList(SqList *sqList){
	free(sqList->elem);
}
int main(){
	/*
	 * 参数为指针类型,传参变量地址或指针类型且该指针指向具体变量内存地址
	 * */
	SqList sqList;
	init(&sqList,10);
	insert(&sqList,1);
	insert(&sqList,3);
	printf("the elem of 3 ,index : %d \n",locateElem(sqList,3));
	printf("sqList'length: %i",getLength(sqList));
	clearSqList(&sqList);
	return 0;
}

参数传入引用,引用为c++中增添的,整体实现更接近数据结构相关书籍伪码。c中没有bool类型,但有支持bool类型的头文件

实现代码:

#include<stdio.h>

#include<malloc.h>
#define ListSize 10
typedef struct SqList{
    int *elem; //线性表存储空间基址
    int length;
    int listsize;
}SqList;
bool InitList(SqList &L){
    L.elem=(int *)malloc(ListSize*sizeof(int));
    /* L.elem=new int[ListSize]; */   //都是以数组形式存储元素
    if(!L.elem) return false;
    else{
    L.length=0;
    L.listsize=ListSize;
    return true;
    }
}  
 //得到表长
int GetLength(SqList L){
    return L.length;
}
  //得到第i个元素
void GetElem(SqList L,int i,int &elem){
    elem=L.elem[i-1];
}
 //判断是否有elem的值相同元素并返回元素序号 
int LocateElem(SqList L,int elem){
    for(int i=0;i<L.length;i++)
    {
        if(L.elem[i-1]==elem){
            return i;
            break;
        }
    }
    return 0;
}
//插入第i个元素前即L.elem[i-1]前
bool InsertList1(SqList &L,int i,int elem) {
    if(i<1||i>L.length+1) return false;   //当i=length+1时即原有最后的元素后一个
    if(L.length>=L.listsize){
        int *newbase;
        newbase=(int *)realloc(L.elem,(L.listsize+ListSize)*sizeof(int));//表满满时                    
        length=listsize
        if(!newbase) return false;
        L.elem=newbase;
     }
    for(int j=L.length;j>i;j--)  L.elem[j]=L.elem[j-1]; //移动i个元素
    L.elem[i-1]=elem;
    L.length++;
    return true;
}
bool InsertList2(SqList &L,int i,int elem) //插入第i个元素后即L.elem[i-1]后
{
    if(i<1||i>L.length) return false;   //当i=length+1时即原有最后的元素后一个
    if(L.length>=L.listsize)   
    {
        int *newbase;
        newbase=(int *)realloc(L.elem,(L.listsize+ListSize)*sizeof(int));//表满满时                
        length=listsize
        if(!newbase) return false;
        L.elem=newbase;
    }
    for(int j=L.length;j>=i;j--)  L.elem[j]=L.elem[j-1]; //移动i-1个元素
    L.elem[i]=elem;
    L.length++;
    return true;
}
bool DeleteList(SqList &L,int i,int &elem)  //删除第i个元素并将值赋予elem
{
    if(i<1||i>L.length) return false;
    elem=L.elem[i-1];
    for(int j=i;j<L.length;j++) L.elem[j-1]=L.elem[j];
    L.length--;
    return true;
}
void ListTraverse(SqList L)       //表的遍历
{
    for(int i=0;i<L.length;i++)
    {
    printf("%i ",L.elem[i]);
    }
    printf("\n");
}
int main()
{
int temp=0;
SqList A;
InitList(A);
InsertList1(A,1,3);
InsertList1(A,2,6);
InsertList2(A,2,2);
InsertList2(A,3,3);
printf("表A长度:");
printf("%i\n",GetLength(A));
printf("表A:");
ListTraverse(A);
printf("删除元素为:");
DeleteList(A,1,temp);
printf("%i\n",temp);
printf("表A:");
ListTraverse(A);
return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值