新人求助,关于头插法建立单链表。
最近学习c语言,关于头插法建立单链表我有一些疑问,希望有大佬能够解答一下,感激不尽。new_node->next=head->next;
head->next=new_node; //(head是空链表的头节点,new_node是新节点,输出的数据是从head->next开始,不会输出head的数据。假设插入3个结点1,2,3,输出是3,2,1,这个程序是正确的)
我想把程序改为(new_node->next=head;head=new_node;),在我的想法中,假设插入1,2,3,从head开始输出,输出应该是3,2,1,100。但是不论插入几个结点,程序只会输出head的数据,就好像insert()函数没有执行一样,我想了很久不明白为什么,希望有大佬帮下我!
下面贴出正确的程序。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Lnode,*Linklist;
Linklist creat_head()
{
Linklist head=NULL;
head=(Linklist)malloc(sizeof(Lnode));
if(head==NULL)
{
printf("内存已满");
return NULL;
}
head->next=NULL;
head->data=100;
return head;
}
void insert(Linklist head,int n)
{
int i;
for(i=0;i<n;i++)
{
Linklist new_node=NULL;
new_node=(Linklist)malloc(sizeof(Lnode));
if(new_node==NULL)
{
printf("内存已满");
}
else
{
printf("插入的结点的值:");
scanf("%d",&new_node->data);
new_node->next=head->next;
head->next=new_node;
}
}
}
void shownode(Linklist head)
{
Linklist tem=head->next;
while(tem)
{
printf("%d \n",tem->data);
tem=tem->next;
}
}
int main()
{
int n;
Linklist a;
printf("插入几个结点:");
scanf("%d",&n);
a=creat_head();
insert(a,n);
shownode(a);
return 0;
}
本帖最后由 yf12312368 于 2019-6-22 23:56 编辑
关键出在a=creat_head();这里,你的a即head,从来没变过,始终指向100那个节点。要注意作用域的不同,函数传参其实是值传递,不会改变a的值。 你的思路是没错,但是head在函数里面被改了,在调用他的地方并没有改,也就是a是你的head,
它一直指向的是第一个节点,并没有变,这就是你改后为什么只能输出100的原因。 今天有时间,帮你改好了,写注释的地方是改的地方
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}Lnode,*Linklist;
Linklist creat_head()
{
Linklist head=NULL;
head=(Linklist)malloc(sizeof(Lnode));
if(head==NULL)
{
printf("内存已满");
return NULL;
}
head->next=NULL;
head->data=100;
return head;
}
void insert(Linklist *temp,int n)//修改为接收二级指针
{
int i;
Linklist head = *temp; //temp就是传进来的头
for(i=0;i<n;i++)
{
Linklist new_node=NULL;
new_node=(Linklist)malloc(sizeof(Lnode));
if(new_node==NULL)
{
printf("内存已满");
}
else
{
printf("插入的结点的值:");
scanf("%d",&new_node->data);
new_node->next=head;//修改1
head=new_node; //修改2
}
}
*temp = head; //for循环结束后,将head赋值回去
}
void shownode(Linklist head)
{
Linklist tem=head;
while(tem)
{
printf("%d \n",tem->data);
tem=tem->next;
}
}
int main()
{
int n;
Linklist a;
printf("插入几个结点:");
scanf("%d",&n);
a=creat_head();
insert(&a,n);//传入a的地址,使a改变
shownode(a);
return 0;
}
newu 发表于 2019-6-22 23:57
今天有时间,帮你改好了,写注释的地方是改的地方
首先谢谢大佬帮助我。
我懂了,就是在主函数里声明的a,a是个指针,它的作用域就是块作用域,到主函数大括号结束,我想要在子函数里修改它的值,只能使用二级指针,就是用a的地址来修改它。(今天才知道指针还有二级指针)
最后我想问下,主函数声明的a(也就是单链表头节点)能不能用什么方法把它作用域提升到整个文件,(就像一个变量static x;),把a声明为全局指针(有没有这种东西)之类的,然后整个文件都能修改a的值。 本帖最后由 newu 于 2019-6-23 21:17 编辑
jiuyuan 发表于 2019-6-23 08:27
首先谢谢大佬帮助我。
我懂了,就是在主函数里声明的a,a是个指针,它的作用域就是块作用域,到主函数大 ...
可以是可以,但不建议这样做,这样命全局变量的方式会增加程序的耦合度。
慢慢学吧 newu 发表于 2019-6-23 08:38
可以是可以,但不建议这样做,这样命全局变量的方式会降低程序的耦合性。
慢慢学吧
好的,受教了,谢谢。
页:
[1]