链表问题,这一句为什么是二级指针

#include "stdio.h"

#include "string.h"
#include "ctype.h"

#include "stdlib.h"

#include "io.h"

#include "math.h"

#include "time.h"

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0

#define MAXSIZE 20 /* 存储空间初始分配量 */

typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 /
typedef int ElemType;/
ElemType类型根据实际情况而定,这里假设为int */

Status visit(ElemType c)
{
printf("%d ",c);
return OK;
}

typedef struct Node
{
ElemType data;
struct Node next;
}Node;
typedef struct Node *LinkList; /
定义LinkList */

/* 初始化顺序线性表 /
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(Node)); /
产生头结点,并使L指向此头结点 /
if(!(*L)) /
存储分配失败 /
return ERROR;
(*L)->next=NULL; /
指针域为空 */

return OK;

}

/* 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
Status ListEmpty(LinkList L)
{
if(L->next)
return FALSE;
else
return TRUE;
}

/* 初始条件:顺序线性表L已存在。操作结果:将L重置为空表 /
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /
p指向第一个结点 /
while(p) /
没到表尾 /
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /
头结点指针域为空 */
return OK;
}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 /
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next; /
p指向第一个结点 */
while(p)

{
i++;
p=p->next;
}
return i;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) /
/
操作结果:用e返回L中第i个数据元素的值 /
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; /
声明一结点p /
p = L->next; /
让p指向链表L的第一个结点 /
j = 1; /
j为计数器 /
while (p && j<i) /
p不为空或者计数器j还没有等于i时,循环继续 /
{

p = p->next; /
让p指向下一个结点 /
++j;
}
if ( !p || j>i )
return ERROR; /
第i个元素不存在 /
*e = p->data; /
取第i个元素的数据 */
return OK;
}

/* 初始条件:顺序线性表L已存在 /
/
操作结果:返回L中第1个与e满足关系的数据元素的位序。 /
/
若这样的数据元素不存在,则返回值为0 /
int LocateElem(LinkList L,ElemType e)
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
if(p->data==e) /
找到这样的数据元素 */
return i;
p=p->next;
}

return 0;

}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L), /
/
操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1 /
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;

j = 1;
while (p && j < i) /
寻找第i个结点 /
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR; /
第i个元素不存在 /
s = (LinkList)malloc(sizeof(Node)); /
生成新结点(C语言标准函数) /
s->data = e;

s->next = p->next; /
将p的后继结点赋值给s的后继 /
p->next = s; /
将s赋值给p的后继 */
return OK;
}

/* 初始条件:顺序线性表L已存在,1≤i≤ListLength(L) /
/
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 /
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) /
遍历寻找第i个元素 /
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /
第i个元素不存在 /
q = p->next;
p->next = q->next; /
将q的后继赋值给p的后继 /
*e = q->data; /
将q结点中的数据给e /
free(q); /
让系统回收此结点,释放内存 */
return OK;
}

/* 初始条件:顺序线性表L已存在 /
/
操作结果:依次对L的每个数据元素输出 */
Status ListTraverse(LinkList L)
{
LinkList p=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf("\n");
return OK;
}

/* 随机产生n个元素的值,建立带表头结点的单链线性表L(头插法) /
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0)); /
初始化随机数种子 /
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL; /
先建立一个带头结点的单链表 /
for (i=0; i<n; i++)
{
p = (LinkList)malloc(sizeof(Node)); /
生成新结点 /
p->data = rand()%100+1; /
随机生成100以内的数字 /
p->next = (*L)->next;

(*L)->next = p; /
插入到表头 */
}
}

/* 随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) /
void CreateListTail(LinkList *L, int n)
{
LinkList p,r;
int i;
srand(time(0)); /
初始化随机数种子 /
*L = (LinkList)malloc(sizeof(Node)); /
L为整个线性表 /
r=*L; /
r为指向尾部的结点 /
for (i=0; i<n; i++)
{
p = (Node *)malloc(sizeof(Node)); /
生成新结点 /
p->data = rand()%100+1; /
随机生成100以内的数字 /
r->next=p; /
将表尾终端结点的指针指向新结点 /
r = p; /
将当前的新结点定义为表尾终端结点 /
}
r->next = NULL; /
表示当前链表结束 */
}

int main()
{

LinkList L;
ElemType e;
Status i;
int j,k;
i=InitList(&L);
printf("初始化L后:ListLength(L)=%d\n",ListLength(L));
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);

printf("ListLength(L)=%d \n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);

i=ClearList(&L);
printf("清空L后:ListLength(L)=%d\n",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是 0:否)\n",i);

for(j=1;j<=10;j++)
        ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L); 

printf("ListLength(L)=%d \n",ListLength(L));

ListInsert(&L,1,0);
printf("在L的表头插入0后:L.data=");
ListTraverse(L); 
printf("ListLength(L)=%d \n",ListLength(L));

GetElem(L,5,&e);
printf("第5个元素的值为:%d\n",e);
for(j=3;j<=4;j++)
{
        k=LocateElem(L,j);
        if(k)
                printf("第%d个元素的值为%d\n",k,j);
        else
                printf("没有值为%d的元素\n",j);
}


k=ListLength(L); /* k为表长 */
for(j=k+1;j>=k;j--)
{
        i=ListDelete(&L,j,&e); /* 删除第j个数据 */
        if(i==ERROR)
                printf("删除第%d个数据失败\n",j);
        else
                printf("删除第%d个的元素值为:%d\n",j,e);
}
printf("依次输出L的元素:");
ListTraverse(L); 

j=5;
ListDelete(&L,j,&e); /* 删除第5个数据 */
printf("删除第%d个的元素值为:%d\n",j,e);

printf("依次输出L的元素:");
ListTraverse(L); 

i=ClearList(&L);
printf("\n清空L后:ListLength(L)=%d\n",ListLength(L));
CreateListHead(&L,20);
printf("整体创建L的元素(头插法):");
ListTraverse(L); 

i=ClearList(&L);
printf("\n删除L后:ListLength(L)=%d\n",ListLength(L));
CreateListTail(&L,20);
printf("整体创建L的元素(尾插法):");
ListTraverse(L); 


return 0;

}

Status InitList(LinkList L)
{
*L=(LinkList)malloc(sizeof(Node)); /
产生头结点,并使L指向此头结点 /
if(!(*L)) /
存储分配失败 /
return ERROR;
(*L)->next=NULL; /
指针域为空 */

return OK;

}
形参改写成LinkLis L
传递实参写成InitList(La);
实现的初始化操作没什么区别把
为什么要用二级指针呢, 统一成一级指针不好吗?

2个回答

一级指针只能修改变量(指针指向的变量)
二级指针可以修改指针(指针的指针指向的指针)
以此类推

因为你要修改指针指向的地址里面的值,如果用一级指针就和传值调用效果一样

qq_37296877
qq_37296877 回复追随圣光吧: 为什么还要修改指针呢?释放指针释放的是指针指向的内存,这么写也可以啊p1,p2假如指向同一块堆中的内存,释放p1,则p2也释放。
2 年多之前 回复
m0_37968915
追随圣光吧 回复qq_37296877: 这样只能修改指针内部存放的地址对应的值,而要修改指针本身的值就需要二级指针指向这个指针然后修改
2 年多之前 回复
qq_37296877
qq_37296877 那我直接传递 指针内部存放的地址 , 不就相当于两个指针指向同一段内存吗?, 这样不可以突破子函数的作用域吗
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何实现 链表的头结点是指针数组,再用二级指针调用?
比如 设一个指针数组每个成员指向1个链表的头节点, 再用二级指针指向这个指针数组, 那么二级指针怎么表示结构体里的数据
这是一个关于链表结点的指针问题
``` #include<iostream> #include<conio.h> #include<string> #include<iostream> #include<conio.h> using namespace std; #define OK 1; typedef int Status; typedef struct { string name; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType Elem; LNode *Next; }LNode,List; Status InitList(LNode *L) { L=new LNode(); return OK; } int main() { LNode *LL; InitList(LL); getch(); return 0; } ``` 上面是我的测试代码。我想测试下链表结点,结构体指针用法。发现了一个很奇怪的现象 ![图片说明](https://img-ask.csdn.net/upload/202001/02/1577950414_463276.png) InitList中的形参是结构体指针L是指针类型,也就是说L是地址。但是我调试的时候,发现L变成了值。那一堆省略号可以体现出来。这是第一个疑问。 L是子函数里的参数,调试退出子函数后,L应该消失才对,不应该有值,但调试结果显示出一堆省略号,证明它还是存在的。这是第二个疑问,求解
建立空单链表的二级指针寓意何在
我复习软件技术基础的单链表时,发现一个很费解的地方: 建立一个空的单链表的函数如下所示: ``` void initiatesl(node **h) { *h = (node *)malloc(sizeof(node)); (*h)->next = NULL; ``` 我想问的是,为什么要用二级指针**h,用*h来表达不可以吗?
这是一个关于数据结构的链表指针赋地址值问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LNode *A; Status InitList(LNode *L) { L=new LNode; if(!L) exit(-1); else (*L).next=NULL; return OK; } int main() { LNode *L; InitList(L); cout<<(*L).next; //下面三行是测试代码,同样给指针赋值为NULL,测试结果,当屏蔽上面代 //码的时候发现,可以出现值。不屏蔽的话,则溢出,执行cout<<(*L).next溢出 int *a; a=NULL; cout<<a; getch(); return 0; } ``` 给链表结点初始化,给next指针赋值为NULL,并输出next指针地址,运行后程序溢出。 我为了探究原因,设计了指针A给A指针赋值NULL,单处运行测试语句, 程序并没有溢出,并且显示出了一个值。 为什么呢,都是赋值NULL,都是输出指针,区别为啥这么大?
这是一个关于数据结构链表 前插法 的指针内容问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 #define ERROR -1 using namespace std; typedef int Status; #define OK 1 typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { Book data; LNode *next; }LNode,*List; Status InitList(List &L) { L=new LNode(); /*if(!B) exit(-1); else */ L->next=NULL; return OK; } Status GetElem(int i,List L,ElemType &e) { List P=L->next; int j=1; while(P&&j<1) { P=P->next; ++j; } if(!P||j<i) return ERROR; e=P->data; return OK; } Status QianCha(List Head,List L,List shou) { if(Head->next=NULL) { Head->next=L; L->next=shou; } else { Head->next=L->next; L->next=NULL; } return 0; } void Q(LNode * &L,int n) { L=new LNode(); L->next=NULL; cout<<L->next; for(int i=0;i<n;i++) { LNode *p=new LNode(); cin>>(p->data.price); p->next=L->next; L->next=p; } } int main() { Book e; /* 注释代码不用看! LNode *tou=NULL; List LL=NULL; List MM=NULL; InitList(tou); List BBB=NULL; InitList(BBB); InitList(LL); InitList(MM); QianCha(tou,BBB,LL); QianCha(tou,,BBB); GetElem(1,tou,e); */ LNode * haha; Q(haha,4); cout<<e.price; getch(); return 0; } ``` 这是我写代码,在调试Q函数(即前插法制造链表)过程中发现 ![图片说明](https://img-ask.csdn.net/upload/201912/29/1577595606_492880.png) L——>next没有值(我很奇怪,因为L是LNode类型指针,它的next被赋值NULL后应该为0000) (*L)->next为000000 这个好奇怪,L是指针类型,那么(*L)就是值类型,值类型不能用->写法的,而且最终得0,也非常奇怪
这是一个关于 数据结构链表结点指针赋值问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 #define ERROR -1 using namespace std; typedef int Status; #define OK 1 typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { Book data; LNode *next; }LNode,*List; Status InitList(List &L) { L=new LNode(); /*if(!B) exit(-1); else */ L->next=NULL; return OK; } Status GetElem(int i,List L,ElemType &e) { List P=L->next; int j=1; while(P&&j<1) { P=P->next; ++j; } if(!P||j<i) return ERROR; e=P->data; return OK; } Status QianCha(List Head,List L,List shou) { if(Head->next=NULL) { Head->next=L; L->next=shou; } else { Head->next=L->next; L->next=NULL; } return 0; } void Q(List &L,int n) { L=new LNode(); L->next=NULL; for(int i=0;i<n;i++) { LNode *p=new LNode(); cin>>(p->data.price); p->next=L->next; L->next=p; } } int main() { Book e; /* 注释代码不用看! LNode *tou=NULL; List LL=NULL; List MM=NULL; InitList(tou); List BBB=NULL; InitList(BBB); InitList(LL); InitList(MM); QianCha(tou,BBB,LL); QianCha(tou,,BBB); GetElem(1,tou,e); */ List haha; Q(haha,4); cout<<e.price; getch(); return 0; } ``` 这是我写的代码,想测试 用前插法生成单链表,在单步调试过程中, 出现这个界面 ![图片说明](https://img-ask.csdn.net/upload/201912/28/1577536824_731100.png) 生成了结点L空间,给L的属性next指针赋值,调试工具中不能看到NULL(即000000地址)为什么呢?
为什么建立链表一定要用new指针
为什么建立链表一定要用new指针,不用new为什么不行……………………
如何理解链表中指针和节点的意义
1.节点中有Data元素和Next元素,指针是直线这个节点还是指向该节点中的Data元素? 2.如何理解双向链表中【p节点前驱的后继】,是指p节点前驱指向的节点(如p-1节点)的后继指向的节点(p)吗?
C语言归并有序单链表的问题
自己写了一个归并两个有序单链表成为一个有序单链表的程序,奈何运行没有结果。 求教各位网友,本人学生,望不吝赐教。 ``` #include<stdio.h> #include<stdlib.h> typedef struct Node{ int data; struct Node *next; } Node; Node* creatNode(int i) { Node *a = (Node *)malloc(sizeof(Node)); a->data = i; a->next = NULL; return a; } void insert(Node* p,int k){ Node* insertion; insertion = creatNode(k); while(p->next!=NULL){ p = p->next; } p->next = insertion; } void merge(Node*a,Node*b,Node**c) { Node *p, *q; //p和q指针分别指向a和b中最小的元素 p = a->next; q = b->next; *c = a; free(b); while(p!=NULL&&q!=NULL){ if(p->data<=q->data){ insert(*c, p->data); p = p->next; } else{ insert(*c, q->data); q = q->next; } } while(p!=NULL){ insert(*c, p->data); p = p->next; } while(q!=NULL){ insert(*c, q->data); q = q->next; } } int main() { Node *a = creatNode(0); insert(a, 2); insert(a, 4); insert(a, 6); Node *b = creatNode(0); insert(b, 1); insert(b, 3); insert(b, 5); Node *c = creatNode(0); merge(a, b, &c); while(c!=NULL){ printf("%d\t", c->data); c = c->next; } getchar(); return 0; } ```
这是一个关于数据结构的链表问题
``` #include<iostream> #include<conio.h> #include<string> #include<iostream> #include<conio.h> using namespace std; #define OK 1; typedef int Status; typedef struct { string name; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType Elem; LNode *Next; }LNode,*List; Status InitList( List &L) { L=new LNode(); L->Next=NULL; return OK; } Status Q(List &tou,int n) { tou=new LNode(); while(n>=0) { List P=new LNode(); P->Next=tou->Next; tou->Next=P; n--; } return 0; } int main() { List tou; Q(tou,4); getch(); return 0; } ``` 我想测试链表中的前插法,Q函数就是完成的这个功能。 我的疑问是: 主函数中,Q(tou,4)表示生成一个头结点tou,后面接四个结点。 四个结点,由Q函数内容可以知道,结点名都是P。请问这样写,为什么能成功呢? 四个结点P,不就是4个重复变量了吗,变量是不能重复的啊!
循坏链表队列中尾指针与头指针的分别指向哪里
我看人民邮电出版社的数据结构(c语言版)第2版,课本例题里链队的头指针front是指向队头元素,尾指针是指向队尾元素的下一位,但在后面的习题里的循坏链表队列的头指针front是指向队头元素的下一位,而尾指针是指向队尾元素,这是自己想指向哪里就指向哪里吗?有没有什么规定的?例题里是普通链队,习题里是循坏链表队列,跟这个有关吗?
这是一个关于链表的取值问题
``` #include<iostream> #include<conio.h> #include<string> #include<iostream> #include<conio.h> using namespace std; #define OK 1; #define ERROR -1; typedef int Status; typedef struct { string name; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType Elem; LNode *Next; }LNode,*List; Status InitList( List &L) { L=new LNode(); L->Next=NULL; return OK; } Status Q(List &tou,int n) { tou=new LNode(); while(n>=0) { List P=new LNode(); P->Next=tou->Next; tou->Next=P; n--; return 0; } } Status GetValue(List L,int n,ElemType Elem) { List P=L->Next; int j=1; while(P&&j<n) { P=P->Next; ++j; } if(!P||j<n) return ERROR; Elem=P->Elem; return OK; } int main() { int a=1; List L; InitList(L); Q(L,4); ElemType en; GetValue(L,2,en); getch(); return 0; } ``` 这是我写的链表代码,做了前插法生成链表(Q函数),还有头结点初始化函数(InitList)。最后想搞个链表取值函数getvalue()。写完后,编译没有问题。但是运行的话,会溢出,求解。
这是一个关于数据结构链表的相关问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; #define OK 1 typedef struct { char name[5]; float price; }Book; typedef struct LNode { Book Elem; LNode *next; }LNode,*List; Status InitList(List *L) { L=new List(); if(!L) exit(-1); //else // (*L).next=NULL; return OK; } int main() { LNode L; L.Elem.price=1; List * LL; InitList(LL); getch(); return 0; } ``` 这是我写的关于链表初始化的代码, 调试过程中发现了一个问题 ![图片说明](https://img-ask.csdn.net/upload/201912/22/1577028508_176326.png) L的值是地址我可以理解,毕竟是指针变量嘛, *L的值怎么还是地址?*L不应该是L地址中的内容吗?应该是结构体值啊!要不L开辟的空间给谁。
C++链表头指针位置不知为什么出错
希望实现第一行输入n和m,后面共输入n+m行 后面有n行由四个数字组成,第一个为1,表示创建新的结点,第二个为此 结点的数据域,第三个为某个结点的数据域(如果为-1则表示此为第一个 创建的结点),第四个为0或者1,若为0表示新结点 建立在第三个数字代表的结点的左边,若为1则表示在右边。 后面有m行由2个数字组成,第一个为0,表示删除结点,第二个为需要删除 的结点的数据域。 最终把最后的链表打印出来,并在末尾加-1表示输出结束。 代码如下: #include<iostream> #include<conio.h> using namespace std; typedef struct node //同学结点 { int data; //同学编号 struct node *next; //结点指针,指向下一个 }NODE; class list { private: NODE *head; int length; public: list(){head=NULL;length=0;} ~list(){} int find(int i) { NODE *p=head; int j=1; //元素地址,第一位标记为第1位 while(p&&p->data!=i&&p&&p!=NULL) { p=p->next; j++; } if(p==NULL)return 0; //未找到返回0 return j; } int Insert(int i,int x,int k) { NODE *p=head, *s; int j=0; int location=find(x); if(location==0) { s=(NODE *)new NODE[1]; s->data=i; s->next=p; head=s; length++; return 1; } if(k==0) //插入左边 { while(p&&j<location-2){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } else if(k==1) //插入右边??? { while(p&&j<location-1){p=p->next;j++;} if(!p)return 0; s=(NODE *)new NODE[1]; s->data=i; s->next=p->next; p->next=s; length++; return 1; } return 0; } int Delete(int i) { NODE *p=head,*q; int j=0; int location=find(i); if(!p)return 0; if(location==1) { head=head->next; delete p; p=NULL; length--; return 1; } while(p->next&&j<i-1){p=p->next;j++;} if(!(p->next)||j>i-1)return 0; q=p->next; p->next=q->next; delete q; q=NULL; length--; return 1; } void setlength(int n,int m) { length=n-m; } void print() //打印函数 { NODE *p=head; for(int i=0;i<length&&p!=NULL&&p;i++) { cout<<p->data<<' '; p=p->next; } } }; int main() { list student; int m,n,a1,a2,a3,a4,a5; scanf("%d",&n); scanf("%d",&m); student.setlength(n,m); for(int i=0;i<n+m;i++) { scanf("%d",&a1); if(a1==1) { scanf("%d",&a2); scanf("%d",&a3); scanf("%d",&a4); student.Insert(a2,a3,a4); } if(a1==0) { scanf("%d",&a5); student.Delete(a5); } } student.print(); cout<<-1; return 0; } 结果指针的顺序倒是没问题,但是打印出来的结果 经常不是从头开始打印,请问这是为什么?
这是 一个关于数据结构的链表问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LNode *A; Status InitList(LNode *L) { L=new LNode; if(!L) exit(-1); else (*L).next=NULL; return OK; } int main() { LNode *L; InitList(*L); cout<<L; getch(); return 0; } ``` 这是我写的完整代码,就是生成了链表结点,还有初始化链表。 其中, ![图片说明](https://img-ask.csdn.net/upload/201912/22/1576944898_291707.png) 划线部分,两个参数我写的一样的,因为形参和实参要一致 但是却报错 --------------------Configuration: 线性表 - Win32 Debug-------------------- Compiling... 线性表.cpp E:\数据结构\线性表.cpp(45) : error C2664: 'InitList' : cannot convert parameter 1 from 'struct LNode' to 'struct LNode *' No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called Error executing cl.exe. 线性表.exe - 1 error(s), 0 warning(s) 为甚么呢?
这是数据结构一个简单的链表问题
``` #include<iostream> #include<conio.h> #include<string.h> #define OK 1 #define MAXSIZE 100 using namespace std; typedef int Status; typedef struct { char name[5]; float price; }Book; typedef Book ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; int main() { LNode *L=new LNode(); LNode *LL; *L.next=LL; getch(); return 0; } ``` 我想弄个含两个结点的单链表,*L是第一个,*LL是第二个,但是在写地址相连代码的时候(即*L.next=LL;),报了这个错误 ![图片说明](https://img-ask.csdn.net/upload/201912/20/1576854200_271660.png) 我感觉很奇怪,定义的指针L也开辟空间了,然后选取了地址next属性,完成对另一个指针的赋值,代码应该没毛病啊。求教
数据结构双向链表指针属性指向的问题
最近在看《零基础学java》,在数据结构中看到双向链表,说每个链表元素都有两个指针属性,一个是previous指向上一个元素本身,另一个是next执行下一个元素本身。可双向链表的结构图却是相反的。问具体是什么情况
关于C++链表指针问题,望解答
ListNode *dummy = new ListNode(-1) ListNode是一个链表结构体,这里定义一个dummy链表指针,我不明白newde作用,还有-1是什么意思?望解答
关于创建链表的一个小问题。
我正在学习链表,下图是一个结构体,然后有一个结构体指针。我知道链表有一个表头,指向数据,然后有指针指向下一数据。 我就是不明白为什么在一个结构体指针函数头里面写链表,这和指针函数头什么意思。 为什么SLIST *Creat_Slist()(一个结构体指针函数头)创建一个链表?这个函数头什么意思? 我会在main里面创建静态链表(这和链表在main函数头里面)并且这个静态链表能够运行。 我正在学,原谅我知识浅薄,请帮帮我。![图片](https://img-ask.csdn.net/upload/201602/17/1455696857_912191.png)
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
win10系统安装教程(U盘PE+UEFI安装)
一、准备工作 u盘,电脑一台,win10原版镜像(msdn官网) 二、下载wepe工具箱 极力推荐微pe(微pe官方下载) 下载64位的win10 pe,使用工具箱制作启动U盘打开软件, 选择安装到U盘(按照操作无需更改) 三、重启进入pe系统 1、关机后,将U盘插入电脑 2、按下电源后,按住F12进入启动项选择(技嘉主板是F12) 选择需要启...
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Java描述设计模式(19):模板方法模式
本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。 public class C01_InScene { public static void main(String[] args) { DevelopApp developApp = n...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
第三个java程序(表白小卡片)
前言: &nbsp;向女神表白啦,作为一个程序员,当然也有爱情啦。只不过,虽然前面两个程序都只是学习了基础的语法结构和向量哈希表。这里涉及的是Swing,awt图形用户界面和一点文件输入输出流的知识。 &nbsp; 表白代码如下: 另附:里面的音乐和图片可以放在一个自己创建的包里面,也可以放在src里面,或者使用绝对路径。至于布局,我自己的使用的是简单的排班,简单的继承。后面的程序会慢慢实现。 ...
8年经验面试官详解 Java 面试秘诀
作者 |胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。 Java程序员准备和投递简历的实...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
化繁为简 - 腾讯计费高一致TDXA的实践之路
导语:腾讯计费是孵化于支撑腾讯内部业务千亿级营收的互联网计费平台,在如此庞大的业务体量下,腾讯计费要支撑业务的快速增长,同时还要保证每笔交易不错账。采用最终一致性或离线补...
Linux网络服务-----实验---PXE和Kickstart的无人值守装机
目录 一.PXE的原理 二.kickstart的原理 三.PXE与kickstart的结合使用自动装机 一.PXE的原理 PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由支持通过网络启动操作系统,再启动过程中,终端要求服务器分配IP地址...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
A*搜索算法概述
编者按:本文作者奇舞团前端开发工程师魏川凯。A*搜索算法(A-star search algorithm)是一种常见且应用广泛的图搜索和寻径算法。A*搜索算法是通过使用启...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
从顶级黑客到上市公司老板
一看标题,很多老读者就知道我在写什么了。今天Ucloud成功上市,季昕华成为我所熟悉的朋友里又双叒叕一个成功上市的案例。我们认识大概是十五年多吧,如果没记错,第一次见面应该是2004年,...
蓝桥杯知识点汇总:基础知识和常用算法
文章目录基础语法部分:算法竞赛常用API:算法部分数据结构部分 此系列包含蓝桥杯绝大部分所考察的知识点,以及真题题解~ 基础语法部分: 备战蓝桥杯java(一):一般输入输出 和 快速输入输(BufferedReader&amp;BufferedWrite) 备战蓝桥杯java(二):java编程规范和常用数据类型 备战蓝桥杯java(三):常用功能符以及循环结构和分支结构 备战蓝桥杯java(四...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Linux自学篇——linux命令英文全称及解释
man: Manual 意思是手册,可以用这个命令查询其他命令的用法。 pwd:Print working directory 意思是密码。 su:Swith user 切换用户,切换到root用户 cd:Change directory 切换目录 ls:List files 列出目录下的文件 ps:Process Status 进程状态 mkdir:Make directory ...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
疫情数据接口api
返回json示例 { "errcode":0,//0标识接口正常 "data":{ "date":"2020-01-30 07:47:23",//实时更新时间 "diagnosed":7736,//确诊人数 "suspect":12167,//疑是病例人数 "death":170,//死亡人数 "cur...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
相关热词 c# 为空 判断 委托 c#记事本颜色 c# 系统默认声音 js中调用c#方法参数 c#引入dll文件报错 c#根据名称实例化 c#从邮件服务器获取邮件 c# 保存文件夹 c#代码打包引用 c# 压缩效率
立即提问