为什么在VS2013运行的结果和别的编译器不一样,求高人指点

先贴上代码
#include
#include
typedef char datatype;
typedef struct node
{
datatype data;
struct node next;
}listnode;
listnode *createlist();
void getnode(listnode *head, char key);
int main(int argc, char *argv[])
{
char key = 0;
listnode *snode;
snode = createlist();
printf("请输入你想要遍历的节点的元素:");
scanf_s("%c", &key);
printf("你想要的遍历的节点中的元素为:");
getnode(snode, key);
printf("\n");
return 0;
}
listnode *createlist()
{
listnode *p;
listnode *head = NULL;
listnode *r = NULL;
char ch;
while ((ch = getchar()) != '\n')
{
p = (listnode
)malloc(sizeof(listnode));
p->data = ch;
if (head == NULL)
head = p;
else
r->next = p;
r = p;
}
if (r != NULL)
r->next = NULL;
return head;
}
void getnode(listnode *head, char key)
{
listnode *p;
p = head;
while (p->next&&p->data != key)
p = p->next;
if (p != NULL)
printf("%c", p->data);
else
printf("你寻找的节点不存在");
}
在VS2013编译的结果是这样的:
图片说明
而在别的编译器里面则都是D,这才是正确结果。
那是什么原因呢,求高人指点,若似乎代码的可移植性问题,请说明。谢谢。分不多,请见谅。

修改为scanf呢?你用的是scanf_s

首先,p = (listnode)malloc(sizeof(listnode)); 分配来的内存空间,最好是初始化一下,即 memset 为全部零;
其次,createlist 的过程的 while 循环中,插入第二个,及以后元素时,r 的使用请检查下。
最后,createlist 完成插入后,先做一个循环将所有元素输出,看看创建的是否正确吧。