Vs2022中使用未初始化的内存

#include 
#include 
#include 
typedef int datatype;
typedef struct node
{
    datatype data;
    int length;
    struct node* next;
}linklist;
int main()
{
    linklist* head;
    head = (linklist*)malloc(sizeof(linklist));
    assert(head);
    int a, b;
    linklist* p, * s, * l;
    head->next = NULL;
    s = NULL;
    printf("请输入链表长度\n");
    scanf_s("%d", &a);
    printf("请输入数据\n");
    for (int i = 0; i < a; i++)
    {
        scanf_s("%d", &b);
        p = (linklist*)malloc(sizeof(linklist));
        assert(p);
        p->data = b;
        if (head->next == NULL)
        {
            head->next = p;
            p->next = NULL;
        }
        else
        {
            s->next = p;
        }
        s = p;
    }
    assert(s);
    s->next = head->next;
    printf("请输入你想删除第几个数的前趋结点\n");
    int c;
    scanf_s("%d", &c);
    l = head;
    for (int i = 1; i <= c; i++)
    {
        l = l->next;
    }
    free(head);
    linklist* t;
    t = l;
    while (t->next != l)
    {
        t = t->next;
    }
    linklist* r;
    r = t;
    while (r->next != t)
    {
        r = r->next;
    }
    r->next = l;
    free(t);
    printf("链表为:\t");
    linklist* w = r;
    while (r->next != w)
    {
        printf("%-5d", r->data);
        r = r->next;
    }
    printf("%-5d\n", r->data);
    printf("\n");
}

img

为啥,头快秃了

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

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int datatype;
typedef struct node
{
    datatype data;
    int length;
    struct node* next;
}linklist;
int main()
{
    linklist* head;
    head = (linklist*)malloc(sizeof(linklist));
    assert(head);
    int a, b;
    linklist* p, * s, * l;
    head->next = NULL;
    s = NULL;
    printf("请输入链表长度\n");
    scanf_s("%d", &a);
    printf("请输入数据\n");
    for (int i = 0; i < a; i++)
    {
        scanf_s("%d", &b);
        p = (linklist*)malloc(sizeof(linklist));
        assert(p);
        p->data = b;
        p->next = NULL;        //修改
        if (head->next == NULL)
        {
            head->next = p;
            //p->next = NULL;   修改
         }
        else
        {
            s->next = p;
        }
        s = p;
    }
    //assert(s);              修改
    //s->next = head->next;   修改
    printf("请输入你想删除链表第几个位置的结点:\n"); //修改
    int c;
    scanf_s("%d", &c);
    if (c > 0) {
        l = head;
        for (int i = 0; l->next && i < c - 1; i++) //for (int i = 1; i <= c; i++) 修改
        {
            l = l->next;
        }
        if (l->next) {          //修改
            linklist* t = NULL; //修改
            t = l->next;        //修改
            l->next = t->next;  //修改
            free(t);            //修改
        }
        //free(head);
    }
    //linklist* t;            //修改
    //t = l;
    //while (t->next != l)
    //{
    //    t = t->next;
    //}
    //linklist* r;
    //r = t;
    //while (r->next != t)
    //{
    //    r = r->next;
    //}
    //r->next = l;
    //free(t);
    printf("链表为:\t");
    linklist* r = head;       //修改   linklist* w = r;
    if (!r || !r->next)       //修改
        printf("NULL");       //修改
    else {                    //修改
        while (r->next != NULL)   //修改   while (r->next != w)
        {
            printf("%-5d", r->next->data); //printf("%-5d", r->data); 修改
            r = r->next;
        }
    }
    //printf("%-5d\n", r->data); //修改
    printf("\n");
}

在链表创建过程中,只是创建了头节点前面的节点,但是没有把链表的长度存储下来,所以后面的代码会出现问题。

在删除某个节点之前,应该检查该节点是否存在。

全部重新生成再看