使用了未初始化的局部变量


#include 
#include 
#include 

#define ElemType int

typedef struct Node {
    ElemType data;
    struct Node* Next;
}LinkList;

void initlist(LinkList * L)
{
    L = (LinkList*)malloc(sizeof(LinkList));
        L->Next = NULL;
}

void CreateFromHead(LinkList *L,int a[]){
    LinkList *s,*r;
    r = L;
    char c;
    int flag = 1;
    while (flag)
    {
        c = getchar();
        if (c != '10') {
            for (int i = 0; i < 10; i++) {
                s = (LinkList*)malloc(sizeof(LinkList));
                s->data = a[i];
                s->Next = r->Next;
                r->Next = s;
            }
        }
        else flag = 0;
    }
}

int main()
{
    LinkList *L;
    int a[10] = { 8,18,28,38,48,58,68,78,88,98 };
    initlist(L);
    CreateFromHead(L,a);
    return 0;
}

错误如下

img

主要函数里*L只是一个指针,没有指向具体的地址。

函数中修改指针的指向并通过参数带回,需要声明为指针的指针,void initlist(LinkList ** L)
调用:initlist(&L);
回车的ascii是10,不需要引号,if (c != 10)

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7513467
  • 这篇博客也不错, 你可以看下删除链表中的元素(如果有多个符合删除要求的值,全部删完)
  • 除此之外, 这篇博客: 单向链表的尾端插入和顺序插入中的 在单链表尾部插入 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • package linkedlist;
    
    public class SingleLInkedList {
        public static void main(String[] args) {
            HeroNode h1 = new HeroNode(1,"宋江","rainontime");
            HeroNode h2 = new HeroNode(2,"wuyong","cleverman");
            HeroNode h3 = new HeroNode(3,"likui","balckHurricane");
            SLL s1 = new SLL();
            s1.add(h1);
            s1.add(h2);
            s1.add(h3);
            s1.show();
        }
    }
    //定义单链表SingleLinkedList
    class  SLL{
        //初始化头节点,头节点不要动,不用于存放数据
        HeroNode head = new HeroNode(0,"","");
        //添加节点到单链表
        //找到当前链表的最后节点,
        //将最后节点的next指向新的节点
    
        public void add(HeroNode heroNode){
            HeroNode temp = head;
            //遍历链表找到最后,头节点不能动,就创建辅助变量temp
    
            while (true){
                if(temp.next == null){
                    break;
                    //是最后一个节点,最后一个节点的指针为null,跳出循环
                }
                temp = temp.next;
                //不是最后一个,就将节点向后移
            }
            temp.next = heroNode;
        }
        //显示链表,遍历
        public void show(){
            //判断链表是否为空
            //头节点不能动,要辅助变量来帮忙遍历
            HeroNode temp = head;
            //判断链表是否为空
            if (temp.next == null){
                System.out.println("链表为空,不能够输出");
            }
            //输出节点的信息,注意将辅助变量temp后移,否则陷入死循环
    
            do{
               System.out.println(temp.next);
               temp = temp.next;
           }while(temp.next != null);
        }
    }
    
    class HeroNode{
        int HeroNO;
        String HeroName;
        String HeroNIckName;
        HeroNode next;
       //在这里不能够在构造方法里添加next,添加的next必须是初始化,但是最后一个变量的next是空的,每一个添加才给它赋值,所以不可以初始化
        public HeroNode(int heroNO,String heroName,String heroNIckName){
            this.HeroNO = heroNO;
            this.HeroName = heroName;
            this.HeroNIckName = heroNIckName;
        }
    
        @Override
        public String toString() {
            return "HeroNode{" +
                    "HeroNO=" + HeroNO +
                    ", HeroName='" + HeroName + '\'' +
                    ", HeroNIckName='" + HeroNIckName + '\'' + '}';
        }
    }
    
  • 您还可以看一下 张旭老师的【拯救者 】数据库系统概论速成课程中的 01·文档下载小节, 巩固相关知识点