#include <stdio.h> #include <stdlib.h> #include <string.h>
#define OK 1 #define ERROR 0 #define OVERFLOW -2
#define MAXSIZE 100
typedef struct Node{ char *s; struct Node *next; }LNode,*LinkList;
void RCreateList_L(LinkList L) //逆序建表 { char str[MAXSIZE]; scanf("%s",&str); while(strcmp(str,"end") != 0) { LinkList p = (LinkList) malloc (sizeof(LNode)); if(!p) exit(-1); p->s = str; p->next = L->next; L->next = p; scanf("%s",&str); } }
void PrintList_L(LinkList L) { LinkList p = L->next; while(p != NULL) { printf("%s\n",p->s); p = p->next; } }
void main() { LNode L; L.s = NULL; L.next = NULL; RCreateList_L(&L); PrintList_L(&L); }
总是输出烫烫烫,但下面的却是正确的????求大牛啊!!指导下小弟。感激不尽。
#include <stdio.h> #include <string.h> #include <stdlib.h>
typedef struct Node{ char *s; struct Node *next; }LNode,*LinkList;
void main() { char str[100]; scanf("%s",&str); LinkList L = (LinkList) malloc (sizeof(LNode)); L->s = str; printf("%s",L->s); }
字符串是文字常量,不能够修改
所以这样 scanf("%s",&str);是不对的吧
需要用到字符串拷贝函数
strcpy();
RCreateList_L()方法中的字符数组char str[MAXSIZE]是个局部变量,出了函数就被释放了,所有你的指针指向了无效的内存,print出来自然是乱码。
二楼分析是对的,虽然用到malloc 但分配的是两个指针,而指针s所指的内容是局部的且重复使用会覆盖,出了那个函数就被释放了。
void RCreateList_L(LinkList L) //逆序建表
{
char *pstr,str[MAXSIZE];
scanf("%s",&str);
pstr =(char*)malloc(strlen(str)+1);
strcpy(pstr,str);
while(strcmp(str,"end") != 0)
{
LinkList p = (LinkList) malloc (sizeof(LNode));
if(!p) exit(-1);
p->s = pstr;
p->next = L->next;
L->next = p;
scanf("%s",&str);
pstr =(char*)malloc(strlen(str)+1);
strcpy(pstr,str);
}
}
看看这个函数的代码吧:
void RCreateList_L(LinkList L) //逆序建表
{
char str[MAXSIZE];
scanf("%s",&str);
while(strcmp(str,"end") != 0)
{
LinkList p = (LinkList) malloc (sizeof(LNode));
if(!p)
exit(-1);
p->s = str;
p->next = L->next;
L->next = p;
scanf("%s",&str);
}
}
其中p->s = str;是有问题的,因为str是局部变量,p中的成员s是指针,指针指向数组str,但是这里的str是个局部变量,所以当函数执行完之后自动释放掉了,那么这时链表中的各个节点的成员变量s指针指向的str就都不存在了。所以就出现了你所说的“烫”。
解决方案一:可以把str变为全局的,但是,最好是str[][]即二维数组。这样保证每个节点指向的值都存在。
解决方案二:把LNode中的成员s改成字符数组,省掉指针的麻烦。
祝您好运哈!!!!