有没有人帮我看一下为什么我这个程序在dev c++ 里面跑不出来?


#include<stdio.h>
#include<malloc.h>

typedef struct node
{
    struct node *next;
    int *data;
}LinkList;

void createListHead(LinkList *L,int n)
{
    int i;
    LinkList *head,*s;
    head = (LinkList*)malloc(sizeof(LinkList)); 
    head->next = NULL;
    
    for(i=0;i<n;i++)
    {
    s=(LinkList*)malloc(sizeof(LinkList));
    s->next = head->next;
    head->next=s;
    
    scanf("%d",s->data);    
    }
}

void printLinkList(LinkList *L)
{
    LinkList * q;
    q = (LinkList*)malloc(sizeof(LinkList));
    q = L->next;
    
    while(q!=NULL)
    {
        printf("%d",*(q->data));    //*(q.date) is equivalent with q->data or not? 
        q=q->next;
    }
    
}

int main()
{
   int n;
   LinkList *L;
   
   printf("请输入你想创建的链表长度:");
   scanf("%d",&n);
   printf("请输入链表的数据:"); 
   
   createListHead(L,n);
   
   printLinkList(L);
   
   return 0;
       
 } 

修改如下,改动处见注释,供参考:

#include<stdio.h>
#include<malloc.h>

typedef struct node
{
    struct node* next;
    int   data;  //int* data;  修改
}LinkList;

void createListHead(LinkList** L, int n) // 修改
//void createListHead(LinkList* L, int n)
{
    int i;
    LinkList* head , * s;
    head = (LinkList*)malloc(sizeof(LinkList));
    head->next = NULL;
    (*L) = head;            // 修改
    for (i = 0; i < n; i++)
    {
        s = (LinkList*)malloc(sizeof(LinkList));
        s->next = head->next;
        head->next = s;

        scanf("%d", &s->data); //scanf("%d", s->data); 修改
    }
}

void printLinkList(LinkList* L)
{
    LinkList* q;
    //q = (LinkList*)malloc(sizeof(LinkList)); 修改
    q = L->next;
    while (q != NULL)
    {
        printf(" %d", q->data);    //*(q.date) is equivalent with q->data or not? 
        //printf("%d", *(q->data)); 修改
        q = q->next;
    }
}

int main()
{
    int n;
    LinkList* L;

    printf("请输入你想创建的链表长度:");
    scanf("%d", &n);
    printf("请输入链表的数据:");

    createListHead(&L, n); // 修改  
    //createListHead(L, n);

    printLinkList(L);

    return 0;

}

:s->data 并未指向一个可用的存储空间,也就是说并没有给s->data分配空间,调用scanf("%d",s->data); 的时候可能出现异常了。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7705518
  • 这篇博客也不错, 你可以看下dev c++编译器里遇到的一些问题
  • 您还可以看一下 林男老师的小学生c++趣味编程入门视频教程 少儿C十十信息学奥赛竞赛网课课程中的 认识DEV-C++小节, 巩固相关知识点
  • 除此之外, 这篇博客: 【个人记录】关于初学者刚开始可能遇到的一些Dev c++报错及其解决方案(随缘更新)中的  5.变量未定义 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题分析: 根据程序的描述和代码分析,发现可能存在以下问题: 1. 没有为链表的头节点L分配内存空间,导致在createListHead和printLinkList函数中对L进行操作时出现错误。 2. 在createListHead函数中,没有为链表节点的data域分配内存空间,导致在scanf函数中可能出现错误。 3. 在printLinkList函数中,没有为临时指针变量q分配内存空间,导致在对其进行赋值操作时出现错误。

    解决方案:

    针对以上问题,我会给出具体的解决方案和优化代码。

    #include <stdio.h>
    #include <stdlib.h> // 添加头文件,以使用malloc和free函数
    
    typedef struct node
    {
        struct node *next;
        int data; // 修改为int类型的data,不再使用int指针类型
    } LinkList;
    
    void createListHead(LinkList **L, int n) // 修改L为指向链表指针的指针
    {
        int i;
        LinkList *head, *s;
        head = (LinkList*)malloc(sizeof(LinkList)); // 为头节点分配内存空间
        head->next = NULL;
    
        for (i=0; i<n; i++)
        {
            s=(LinkList*)malloc(sizeof(LinkList));
            s->next = head->next;
            head->next=s;
    
            scanf("%d", &(s->data)); // 修改读取data的方式
        }
    
        *L = head; // 将头节点赋值给传入的指针变量L
    }
    
    void printLinkList(LinkList *L)
    {
        LinkList *q = L->next; // 去除不必要的内存分配,直接指向头节点的下一个节点
    
        while (q!=NULL)
        {
            printf("%d ", q->data);
            q=q->next;
        }
        printf("\n");
    }
    
    int main()
    {
        int n;
        LinkList *L = NULL; // 初始化L为NULL
    
        printf("请输入你想创建的链表长度:");
        scanf("%d", &n);
        printf("请输入链表的数据:");
    
        createListHead(&L,n); // 修改为传入L的地址
    
        printLinkList(L);
    
        free(L); // 释放链表的内存空间
    
        return 0;
    
    } 
    

    通过以上的优化,解决了问题中的指针错误,并对程序进行了优化。其中: 1. 在createListHead函数中,对头节点L进行了动态内存分配,并进行了赋值操作。 2. 在createListHead函数中,修正了scanf函数中读取data的方式。 3. 在printLinkList函数中,去除了不必要的指针动态内存分配操作。 4. 在main函数中,初始化了L,并在程序结束前释放了链表的内存空间,防止内存泄漏。

    请尝试使用优化后的代码运行,看看是否能够解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^