首页 > 编程知识 正文

sqlist类型,sqlist类型顺序表

时间:2023-05-06 03:08:43 阅读:160532 作者:2537

SqList *L和SqList *L

了解SqList *L和SqList *L

在复习数据结构(勤奋的荷兰豆C版)时,SqList * L似乎无法在今天花时间整理。

typedef struct

{

Elemtype data[MaxSize];

int length;

}SqList;

//voidcreatelist(SQList*L,ElemType a[ ],int n ) { int i; L=(sqlist* ) malloc (sizeof ) sqlist ); for(I=0; i n; I ) L-data[i]=a[i]; L-length=n; }voiddisplist(sqlist*L ) ) { int i; for(I=0; i L -length; I ) printf(“%d”,L-data[i]; printf(「n " ); }第一个函数是初始化,第二个函数输出结构数组的值。 第一个函数的形状参数是SqList * L。 什么意思?

这里请先说这是c版本!

SqList * L可视为(SqList * ) l

是SqList型的指针,l是引用,只在c中有。 引用可以理解变量的其他名称。

举个例子:

int x=110; int y=x; cout y 't'y endl; //其中针对y的操作是针对x的操作cout x 't'xendl; y是x的参照。 于是y是x的另一个绰号。 不是的绰号,但又是同一个人。 和指针不同。 指针变量有自己的地址,但没有引用。

理解了引用。 返回来看,(SqList * ) l是SqList *类型的引用,我们对l的操作就相当于对传入的SqList类型的指针进行操作。

ElemType a[100]; int n=33; Sqlist* list; //此时list是野针; 无分配空间的内存创建列表(list,a,n ); //函数中的操作向list分配空间//传递的是Sqlist*类型的list//(sqlist * ) L=list; 如果是//,则针对l的操作与针对list指针的操作相同; (SqList * ) l理解了这一点。 改为形参类型的SqList *L怎么样?

voidcreatelist(SQList*L,ElemType a[],int n ) {int i; L=(sqlist* ) malloc (sizeof ) sqlist ); for(I=0; i n; I ) L-data[i]=a[i]; L-length=n; cout 'L=' L endl; cout 'L=' L endl; }ElemType a[100]; int n=33; Sqlist* list=NULL; cout 'list=' list endl; cout 'list=' list endl endl; 创建列表(list,a,n ); 传入的实参仍然是SqList类型的指针,根据以上分析:

传递SqList类型的指针时,可以这样理解

Sqlist L=list*;

指针list指向的内存已被复制到l。 问题是list没有指向实际的内存

(Sqlist* list=NULL; ),而是指向空指针((这是合法的); 如下图所示;

目前没有问题。 l和list指向同一个地址。

接下来继续看!

L=(sqlist* ) malloc (sizeof ) sqlist ); 使用malloc申请的Sqlist大空间malloc分配内存时,将返回void类型的指针,并强制转换为Sqlist*类型的指针。 在这种情况下,l所指的存储器地址不同。

但是,输入的list得到了空间,这是单方面的传递过程! 所以Sqlist*的形参不会修改传入的指针。 还是引用方便。

但是你不想用引用吗? 有什么方法?

这里的问题是,如果你把指针交给函数,

如何修改修改指针所指向的内容,而且这个修改要实打实的修改,而不是修改一个副本!

1.函数返回指针(虽然不是传入指针)
这里就不多说了

Sqlist* ReturnList( ElemType a[], int n){int i;Sqlist* L = NULL;L = (Sqlist*)malloc(sizeof(Sqlist));for (i = 0; i < n; i++)L->data[i] = a[i];return L;}

2.使用多重指针
为什么说是用多重指针呢?

我们先来回顾下指针的引用
int a = 20;
int *p = &a;

整型变量 a 有自己的地址
整型指针变量 p 也有自己地址
我们都知道*p 等于 20 ,因为通过地址我们可以找到内存都对应的值;

回来看函数

void CreateList(Sqlist** L, ElemType a[], int n){int i;cout << "L 所指向的内存地址 " << L << endl;cout << "L 自己内存地址 " << &L << endl;cout << "L 指向的地址所存储的值是 " << *L << endl;*L = (Sqlist*)malloc(sizeof(Sqlist));cout << "申请内存后 *L 所指向的内存地址 " << *L << endl;cout << "L 所指向的内存地址 " << L << endl;for (i = 0; i < n; i++)(**L).data[i] = a[i];(**L).length = 994;}

这里的形参是一个二重指针

首先我们遇到的问题是传什么进来好呢?
指针的指向的地址?指针指向的地址所在的值?还是指针变量的其自身的地址呢?

Sqlist* list = NULL;// &list 即指针变量的地址// list 为null(0x0000000)// *list 为指向null内存???不用看,肯定不行

那我们传入 &list 试试

于是可以简化为

(Sqlist*)* L = & list ;

还是按照上面的分析来

通过这样的赋值后我们看看各个指针变量的变化

现在L指针所指向的地址是 list的地址

所以呢 *L 的值为 0x0000000(NULL)

那么我们画个表来看看

ps:颜色相同即值相同)
这下明了吧

接下来申请内存空间

*L = (Sqlist*)malloc(sizeof(Sqlist));

*L 是什么? 是指针变量 list所存放的值呀 即 0x0000000(可以看上表)
*L变化了 list储存的值也变化了 ,既让这样子,list所指向的值内存地址也变化了,变了什么呢,不就是刚申请的内存空间的地址吗!!!

这不刚好满足要求吗,传入一个指针修改其指向的内容!

啊,这就是多重指针的用处吗!!!

收! 以后在补充!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。