/*链表结点定义和链表创建和取元素操作*/
struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void CreateList_L(LinkList *L,int n) /*创建链表直接使用单重指针就可以了啊,
参数列表应该是LNode *L或LinkList L,为什么要使用双重呢,使用双重指针
存放指针的地址,改变指针的值有什么作用,这个初始化过程从指针的地址传
进来是怎么继续下去的呢?*/
{
int i;
LinkList p;
*L=(LinkList)malloc(sizeof(struct LNode));
(*L)->next=NULL;
for(i=n; i>0; --i)
{
p=(LinkList)malloc(sizeof(struct LNode));
scanf("%d",&p->data);
p->next=(*L)->next;
(*L)->next=p;
}
}
Status GetElem(LinkList L,int i,ElemType *e) /*取元素不改变原值参数列表
应该像顺便表取元素值一样不用指针,用LNode L,为什么要使用指针?*/
{
int j=1;
LinkList p=L->next;
while(p&&j<i)
{
p=p->next;
j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
/*以下为顺序表初始化和取元素操作*/
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
Status InitList_Sq(SqList *L)//初始化改变原值用指针
{
L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem) exit(OVERFLOW);
L->length=0;
L->listsize=LIST_INIT_SIZE;
return OK;
}
int GetElem(SqList L,int i,ElemType *e)//取元素不改变原值,参数列表不用指针
{
if(i<1||i>L.length) return 0;
*e=L.elem[i-1];
return 1;
}
解决方案
20
链表的头指针,是个非常重要的东西
它在程序的使用中,代表整个链表。
创建链表,需要给头指针赋值,尤其是不带空头节点的单链表
一级指针,不能改变链表的头指针,
只有传递二级指针,才可以
另外一般都说 一级指针,二级指针,。多级指针
很少有人说双重指针的,三重指针的
它在程序的使用中,代表整个链表。
创建链表,需要给头指针赋值,尤其是不带空头节点的单链表
一级指针,不能改变链表的头指针,
只有传递二级指针,才可以
另外一般都说 一级指针,二级指针,。多级指针
很少有人说双重指针的,三重指针的
40
你假如想在某个函数内改变指针的指向,那么需要传二级指针。
假设你main函数里定义了一个指针叫head,然后调用fun函数(形参名叫h2)
你假如传的是一级指针,那么仅仅只是head和h2所指的是同一块内存区域,而h2和head本身并不是同一个指针
假设你main函数里定义了一个指针叫head,然后调用fun函数(形参名叫h2)
你假如传的是一级指针,那么仅仅只是head和h2所指的是同一块内存区域,而h2和head本身并不是同一个指针