顺序表定义 :顺序表 是线性表的顺序储存结构 ,顺序表就是将线性表中的数据元素按照线性顺序存储到指定位置开始的、一块连续的存储空间中。
顺序表的操作实现:
#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 指向第二个元素
总结来说:
一般的传指针,那么都是复制一个指针,
如果想要使用原有的指针,就使用指针引用