链表中linklistl与linklist*l借鉴

mykonons mykonons     2022-08-04     487

关键词:

链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别
typedef struct Node{
int elem;
struct node * next;
}node,*LinkList;

对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;

对于LinkList *L:L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(*L)->elem,当然,(**L)就是Node型结构体了,所以可以用点运算符来访问结构体成员,即(**L).elem;

在链表操作中,我们常常要用链表变量作物函数的参数,这时,用LinkList L还是LinkList *L就很值得考虑深究了,一个用不好,函数就会出现逻辑错误,其准则是:
如果函数会改变指针L的值,而你希望函数结束调用后保存L的值,那你就要用LinkList *L,这样,向函数传递的就是指针的地址,结束调用后,自然就可以去改变指针的值;
而如果函数只会修改指针所指向的内容,而不会更改指针的值,那么用LinkList L就行了;

下面说个具体实例吧!

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

typedef int ElemType;
typedef struct Node{
ElemType elem;
struct Node * next;
}Node, * LinkList;

//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用*L
void InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
}

//清空链表L,使L重新变为空链表,函数调用完后不会改变指针L的值,只会改变指针L所指向的内容(即L->next的值)
void ClearList(LinkList L)
{
LinkList p;
while(p = L->next)
free(p);
}

//销毁链表L,释放链表L申请的内存,使L的值重新变为NULL,所以会改变L的值,得用*L
void DestroyList(LinkList *L)
{
LinkList p;
while(p = (*L)->next )
free(p);
free(*L);
*L = NULL;
}

int main()
{
LinkList L = NULL;
InitList(&L);
ClearList(L);
DestroyList(&L);
}

线性表总结(代码片段)

...List;voidCreateListF(LinkList&L,intn);//头插法建链表voidDispList(LinkListL);//输出链表voidDestroyList(LinkList&L);//销毁链表intmain() LinkListL; intn; cin>>n;//输入链表节点个数 CreateListF(L,n);//头插法建链表 DispList(L);//输出链表 DestroyList(L);//销... 查看详情

数据结构(c语言版)严蔚敏->单链表的定义及合并两个有序单链表(代码片段)

...inkList;voidInitList_L(LinkList&L);//初始化单链表boolListEmpty_L(LinkListL);//判断单链表是否为空intListLength_L(LinkListL);//获取单链表的长度voidClearList_L(LinkList&L);//清空链表boolGetElem_L(LinkListL,intpos,int&e);//获取pos位置上的数据元素,... 查看详情

数据结构-编写代码错误集合a-集合ba中的元素不能再b中出现

...));if(!L)exit(-1); L->next=0;//尾部插入法创建链表voidCreatList(LinkListL,intn) inti; LinkListp,s; p=L;for(i=n;i>0;i--) s=(LinkList)malloc(sizeof(Lnode)); if(!s)exit(-1); scanf("%d",&s->data); L->next=0; p->next=s; p=p->next;//打印链表中的个元素voidDispla... 查看详情

c语言创建链表,函数调用部分

...uctNode*next;LNode,*LinkList;//建立单链表子函数voidCreate_LinkList(LinkListL,DataTypex) LNode*s; //定义指向当前插入元素的指针 while(x!=flag) s=(LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间 s->data=x; s->next=L->next; L->ne... 查看详情

指针在建立链表时的应用(代码片段)

btypedefstructNodeintelem;structnode*next;node,*LinkList;对于LinkListL:L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem;对于LinkList*L:L是指... 查看详情

用c语言创建链表

...tructLNode ElemTypedata; structLNode*next;LNode,*Linklist;voidCreateList_H(LinklistL,intn) LNode*p; ElemTypeval; inti; L=(LNode*)malloc(sizeof(LNode)); L->next=NULL; for(i=0;i<n;i++) p=(LNode*)malloc(sizeof(LNode)); scanf("%d",&(val)); p->data=val; p->next=L->next; L-&... 查看详情

在有序链表中插入数据

...p;  ElemTypedata;    structLNode*next;LNode,*LinkList;voidCreateList(LinkList&L,intn)    L=newLNode;    L->next=NULL;    LNode*p=L;  &nbs 查看详情

两个链表合并

...下一个节点的指针,尾节点的指针为NULL Linklistconnect(LinklistL1,LinklistL2)p3=L2;p->next=L1;//p为L2 查看详情

带头结点与不带头结点的单链表实现(代码片段)

不带头结点:typedefstructLNodeintdata;structLNode*next;LNode,*LinkList;//初始化一个空的单链表boolInitList(LinkList&L)L=NULL;returntrue;voidtest()LinkListL;InitList(L);带头结点:typedefstructLNodeintdata;structL 查看详情

链表学习(代码片段)

...的地址其结构体定义如下:typedefstructNode intdata; Node*next;LinkList,LinkNode;//LinkList:表头ListNode:节点链表的算法实现链表的初始化boolListInit(LinkList*&L) L=newLinkList; if(!L)returnfalse;//初始化失败 L->next=NULL; L->data=-1; returntrue;在链表的... 查看详情

2023-03-25单链表linklist的基本操作(代码片段)

...于typedefstructLNode*LinkList;LinkLista相当于structLNodeaboolinitlist(LinkListL)//初始化单链表L=NULL;//赋为空表returntrue;LNode*GetElem(LinkListL,inti)//按位查找结点LNode*p;//存放最后返回的结点p=L->next;//先从第一个结点开始遍历if(i==0)returnL;//第零个节... 查看详情

linklist*l和linklist*&l和linklist&*l

 结论 LinkList*L和LinkList*&L引用L是为了改变L的值,而L指向的是链表的头结点的地址,即要改变头结点的地址,但是一般改链都是对头结点之后的结点进行操作,所以头结点的地址一直没变,故去掉&后函数依旧可以正... 查看详情

删除重复元素

...点*/typedefstructintdata;structLNode*next;LNode,*LinkList;voidDeleteEqual(LinklistL)//-----删除相等的元素p=L->next;if(p)q=p->next;while(p-& 查看详情

单链表的插入和删除(代码片段)

1#defineOKO12#defineERROR03typedefstructLnode4ElemTypedata;//数据域5structLnode*next;//指针域6Lnode,*Linklist;7Lnode*LocateElem_L(LinklistL,Elemtypee)8//在链表中查找值为e的数据元素9Lnode*p;10p=L->next;11while(p&am 查看详情

链表|去除递增有序单链表中的重复元素

王道P37T12主代码:voiddelete_common(LinkList&L){LNode*pre=L,*p=L->next;while(p!=NULL){LNode*r=p->next;while(r!=NULL&&p->data==r->data){pre->next=r;LNode*del=p;p=r;deletedel;r=r-&g 查看详情

链表|递归删除不带头结点链表所有x元素

...点。王道上的答案绝对是错的,我自己想了一个函数主体LinkList*del_x(LinkList*prior,LinkList*L,intx){if(L==NULL)returnNULL;if(L->data==x){if(prior==NULL){LinkList*ans=L->next;deleteL;if( 查看详情

链表模板(代码片段)

...algorithm>usingnamespacestd;typedefstructLnodeintdata;Lnode*next;Lnode,*linklist;voidcreat_h(linklist&L)//头插法linklists;intn,tmp;L=(linklist)malloc(sizeof(Lnode));L->next=NULL;scanf("%d",&n);for(inti=1;i<=n;i++)scanf("%d",&tmp);s=(linklist)malloc(sizeof(Lnode));//新建立... 查看详情

有关单链表问题,学的太渣,求教大神

...a; structLNode*next;LNode,*LinkList;//结构体类型定义voidInsert_list(LinkListL,intm) LinkListp=L,s; intj=0; printf("请输入插入的一个整数m"); scanf("%d",&m); while(p!=NULL) p=p->next; if(p->data>=m)//找插入位置 s=(LinkList)malloc(sizeof(LNode))... 查看详情