数据结构之顺序表

顺序表定义 :顺序表 是线性表的顺序储存结构 ,顺序表就是将线性表中的数据元素按照线性顺序存储到指定位置开始的、一块连续的存储空间中。

顺序表的操作实现:

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

#define MAX 100   //data数组所能存储的最大数据  

typedef struct  
{  
    int data[MAX];  
    int length;              //当前的存储数据的长度  
}List;  
  
void CreateList(List *&L,int a[],int n)    //创建一个顺序表  
{  
    int i;  
    L = (List *)malloc(sizeof(List));     //声明存储空间  
    for(i = 0;i< n;i++)  
    {  
        L->data[i] = a[i];  
    }  
    L->length = n;  
}  
  
void InitList(List *&L)                //初始化顺序表    
{  
    L = (List *) malloc(sizeof(List));  
    L->length = 0;  
}  
  
void DestoryList(List *&L)            //销毁顺序表  
{  
    free(L);  
}  
  
bool IsEmpty(List *L)                  //顺序表为空  
{  
    return L->length == 0;  
}  
  
int ListLength(List *L)                //顺序表的长度  
{  
    return L->length;  
}  
  
void OutPutList(List *L)                 //输出顺序表中存储的数据  
{  
    int i ;  
    for(i = 0;i < L->length;i++)  
    {  
        printf("%d ",L->data[i]);  
    }  
    printf("\n");  
}  
  
bool  GetValueList(List *L,int &n)           //得到顺序表中的第n个元素的值  
{  
    if(n< 0 ||n > L->length)  
    {  
        return false;  
    }  
    else  
    {  
        n = L->data[n-1];  
        return true;  
    }  
}  
  
int FindNumberList(List *L,int e)          //判断某数据是否在顺序表中的位置  
{  
    int i ;  
    for(i = 0; i< L->length;i++)  
    {  
        if(L->data[i] == e)  
        {  
            return i + 1;  
        }  
    }  
        return 0;  
}  
  
bool InsertDataList(List *&L,int pos,int num)          //在一个位置插入一个数据  
{  
    int i;  
    if(pos < 0 ||pos >L->length + 1)  
    {  
        return false;  
    }  
    for(i = L->length-1;i > pos;i--)  
    {  
        L->data[i + 1] = L->data[i];  
    }  
    L->data[i] = num;  
    L->length ++;  
    return true;  
}  

bool DeleteDataList(List *&L,int pos)             //删除某个位置上的数据元素  
{  
    if(pos <0 || pos > L->length)  
        return false;  
  
    for(i = pos-1;i<L->length;i++)  
    {  
        L->data[i] = L->data[i+1];  
    }  
    L->length --;  
    return true;  
}  

int main()  
{  
  
    return 0;  
}  

在看完上述实现后,可能会对 *L 和 *&L的区别有疑惑:

解释:

List  *&L 等价于 List*  &L 。List*  表示 一个指针类型的List结构,&L表示一个引用,即:这是一个指针引用

List *L  是 一个List类型的指针。

二者使用的区别:

在传递 的函数参数是指针类型的话,那么编译器会复制一个指针,那么我们在函数内部使用的指针就是复制 之后的指针,而不是原来的指针了。

如果需要使用原来的指针 ,则需要传递指针引用。即:List *&L,那么我们在函数 内部操作的指针 还是 原来传过来的指针对象:

下面来个 例子说明下:

void function_1( int *p)

{

         p++;
}

void function_2(int *&p)

{

         p++
}

int data[100];

int *p = a;

function(p);

 // p指向第一个元素

function_2(p);

//p 指向第二个元素

 

总结来说:

一般的传指针,那么都是复制一个指针,

如果想要使用原有的指针,就使用指针引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值