关于单链表的一个问题,只要出现L=L->next这样的语句直接崩溃

时间:2023-02-22 21:58:14
下面是我的源代码:

#include "stdio.h"
typedef struct Node{
int elem;
struct Node *next;
}Link,*List;

void InitLink(List L);//初始化单链表
void CtreateLink(List L);//为单链表录入数据
void print(List L);//打印单链表

void main()
{
List T,S;



InitLink(T);
S=T;

printf("Enter Data:");
CtreateLink(S);//这个函数出现问题

print(T);//这个函数出现问题


}


//初始化单链表
void InitLink(List L){
L=(List)malloc(sizeof(Link));
}


//为单链表录入数据
void CtreateLink(List L){
List r;
int elem;
r=(List)malloc(sizeof(Link));
scanf("%d",&elem);

while(elem!=-1)
{
r->elem=elem;
L->next=r;               //在L->next=r这块程序直接崩溃
L=r;
printf("Enter Data:");
scanf("%d",&elem);
}
L->next=NULL;
}


//打印单链表
void print(Link *L){

L=L->next;      //在L=L->next这块程序直接崩溃     
while(L!=NULL)
{
printf("%d ",L->elem);
L=L->next;
}
}

11 个解决方案

#1


print

最好能先判断  L; 如果只一个元素的,直接coredump

if(NULL == L)
  return;

#2


List T,S;
相当于: Link *T, *S;

指针没有分配内存

#3


InitLink(T);
你这样并没有给T分配空间,除非使用二级指针。

#4


引用楼主 newMFCer 的帖子:
//初始化单链表
void InitLink(List L){
    L=(List)malloc(sizeof(Link));
}



应该改成:

void InitLink(List* pL) {
  *pL = (List)malloc(sizeof(Link));
}

#5


而且初始化也没有指示List->next=NULL
void InitLink(List L){
    L=(List)malloc(sizeof(Link));
}
主要是这个吧。应该把改变了的L返回回去,否则主函数没有改变吧。

#6


3,4楼跟我的想法差不多。

#7


void InitLink(List L){
    L=(List)malloc(sizeof(Link)); 只是对局部变量进行内存分配
}

改成 
void InitLink(List *L){
    *L=(List)malloc(sizeof(Link));
}
或者

List InitLink(){
    return (List)malloc(sizeof(Link));
}
 InitLink(T)  ==》 T =  InitLink();

#8


Link T在外面是NULL,进入InitLink(Link L)之后,相当于把NULL给了Link L,此后L和T就没关系了

#9


支持7楼的

初始化有错 造成空指针

#10


malloc(配置内存空间)
相关函数
calloc,free,realloc,brk
表头文件
#include<stdlib.h>
定义函数
void * malloc(size_t size);
函数说明
malloc()用来配置内存空间,其大小由指定的size决定。
返回值
若配置成功则返回一指针,失败则返回NULL。

范例
void p = malloc(1024); /*配置1k的内存*/

malloc 方法的返回值是指针,  
你的 L=(List)malloc(sizeof(Link)); 定义不对。

#11


谢谢各位了 问题解决!1

#1


print

最好能先判断  L; 如果只一个元素的,直接coredump

if(NULL == L)
  return;

#2


List T,S;
相当于: Link *T, *S;

指针没有分配内存

#3


InitLink(T);
你这样并没有给T分配空间,除非使用二级指针。

#4


引用楼主 newMFCer 的帖子:
//初始化单链表
void InitLink(List L){
    L=(List)malloc(sizeof(Link));
}



应该改成:

void InitLink(List* pL) {
  *pL = (List)malloc(sizeof(Link));
}

#5


而且初始化也没有指示List->next=NULL
void InitLink(List L){
    L=(List)malloc(sizeof(Link));
}
主要是这个吧。应该把改变了的L返回回去,否则主函数没有改变吧。

#6


3,4楼跟我的想法差不多。

#7


void InitLink(List L){
    L=(List)malloc(sizeof(Link)); 只是对局部变量进行内存分配
}

改成 
void InitLink(List *L){
    *L=(List)malloc(sizeof(Link));
}
或者

List InitLink(){
    return (List)malloc(sizeof(Link));
}
 InitLink(T)  ==》 T =  InitLink();

#8


Link T在外面是NULL,进入InitLink(Link L)之后,相当于把NULL给了Link L,此后L和T就没关系了

#9


支持7楼的

初始化有错 造成空指针

#10


malloc(配置内存空间)
相关函数
calloc,free,realloc,brk
表头文件
#include<stdlib.h>
定义函数
void * malloc(size_t size);
函数说明
malloc()用来配置内存空间,其大小由指定的size决定。
返回值
若配置成功则返回一指针,失败则返回NULL。

范例
void p = malloc(1024); /*配置1k的内存*/

malloc 方法的返回值是指针,  
你的 L=(List)malloc(sizeof(Link)); 定义不对。

#11


谢谢各位了 问题解决!1