2024-05-14 02:38:57
对初学者来说,如果只看很基本的插入、删除等操作,程序运行结果上有无区别?
如果是链表的操作的话,那么没有任何区别,因为一个节点里面有指向下一个节点的地址,只要有这个地址,就能确定一个内存区域。
struct linklist
{
...//数据
struct linklist *pNext;//这个用于指向下一个结构体,不需要数组一样的连续内存区域
}
2024-05-14 05:12:26
我试过不需要再分配都可以用next。
那是一个地址,但是没有空间。如果不用malloc你试试:
Link l;
l.next->e根本放不进去东西的,程序会退出的。l.next是在Link l;时就分配好的指针变量,地址还没确定呢。
可以放的,就用你上面的代码。
vc6.0反正是不行。有图有真相。
可是我说的是当前这个节点,你再声明一个Link nextL,刚刚那个s.next=L,再L.p="hello"不就行了?
行啊,但是这样做你就是要创建很多结构体变量了,而且各个还是独立的。如果你这个nextL.next还要放呢,你是不是还要搞个nextnextL的变量?这就不灵活了。
node *tail;
tail=(node*)malloc(sizeof(node));
tail->v=20000;
tail->next=NULL;
q->next=tail;
node tail;
tail.v=20000;
tail.next=NULL;
q->next=&tail;
功能是在末尾追加一个节点,下面的报错,你说是为什么?
都行的啊。你的q有没malloc?
编译是没错,但是在遍历输出的时候,使用下面的情况下,输出完最后一个似乎还有个next,然后就报错了。
有问题还是贴代码吧,应该没有什么疑问了吧?
贴不下,你上面实际上并没有说出这两者的区别,不过如果你解释了上面我的代码为什么报错就采纳你。代码已经贴了,q就是尾节点,输出是标准的输出函数。
你的代码都不完全。出错的原因不好解释。区别就是malloc灵活,无用定义无数个变量。你的这种方式可以,但是要定义多个变量,然后连到一起。
那你就定义一个标准的结构体,初始化一下,然后用我上面两种方式添加个尾节点再遍历输出试试。
#include "stdio.h"
#include "stdlib.h"
struct Link
{
char *p;
struct Link *next;
};
struct Link2
{
short p;
struct Link2 *next;
};
int main()
{
//你的做法
struct Link l,a,b,c;
l.next=&a;
a.next=&b;
b.next=&c;
l.p="hello ";
a.p="world ";
b.p="HI ";
c.p="C ";
printf("%s%s%s%s\n",l.p,a.p,b.p,c.p);
//标准的做法
int i=0;
struct Link2 head,*t;
t=(struct Link2 *)malloc(sizeof(struct Link2));
t=&head;
while (i<10)
{
t->p=i;
t->next=(struct Link2*)malloc(sizeof(struct Link2));
t=t->next;
i++;
}
t->next=NULL;
printf("created\n");
t=&head;
i=0;
while(t->next!=NULL)
{
printf("%d\n",t->p);
t=t->next;
}
return 0;
}
2024-05-14 05:59:51
对初学者来说,如果只看很基本的插入、删除等操作,程序运行结果上有无区别?
在结果上无区别。只是写代码的时候一个用“->”访问结构体内成员,一个用"."访问结构体内成员。除非对直接声明变量获取的指针再复制给一个指针变量。
在对@爱问西瓜爱答树的答案的追问中,我的代码有个奇怪的报错,你认为是什么原因?
没看到你的完整代码,也不清楚报错信息是什么,不好判定原因。
2024-05-14 03:34:41
2024-05-14 05:14:26
要用malloc,多个函数反而还更灵活了?是更复杂了吧!
是分配的时候更灵活了,当然可以理解为使用更复杂