/*链表结点定义和链表创建和取元素操作*/ 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本身并不是同一个指针