建立、删除、释放链表,再输出,不知道问题出在哪



#include<stdio.h>
#include<stdlib.h>
typedef struct LinkList
{
    int num;
    struct LinkList* next;
}List;
int main()
{
    int n, k, i;
    scanf_s("%d", &n);
    List* head=NULL, * p1=NULL, * p2=NULL, * p=NULL;
    for (i = 0; i < n; i++)
    {
        p1 = new List;
        scanf_s("%d", &p1->num);
        if (head == NULL)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
    }
    p1->next = NULL;
    scanf_s("%d", &k);
    p1 = head; p2 = p1;
    while (p1)
    {
        if (p1->num == k)
        {
            if (p1 == head)
                head = p1->next;
            else if (p1->next == NULL)
                p2->next = NULL;
            else
            {
                p = p1;
                p2->next = p1->next;
                delete p;
            }
        }
        p2 = p1;
        p1 = p1->next;
    }
    p = head;
    while (p)
    {
        printf("%d ", p->num);
        p = p->next;
    }
    p1 = p2 = head;
    while (p1)
    {
        p2 = p1->next;
        delete p1;
    }
}

img


输入有问题,点回车不出结果是为什么

暂时看来你最后删除链表有问题,line53-line57,只删了一个节点,delete p1之后p1就等于null了
然后不知道链表需不需要头结点,有些可能需要一个head结点,head->next才开始存放数组的值

修改见注释处,供参考:

#include<stdio.h>
#include<stdlib.h>
typedef struct LinkList
{
    int num;
    struct LinkList* next;
}List;
int main()
{
    int n, k, i;
    scanf("%d", &n);
    List* head=NULL, * p1=NULL, * p2=NULL, * p=NULL;
    for (i = 0; i < n; i++)
    {
        p1 = new List;
        scanf("%d", &p1->num);
        if (head == NULL)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
    }
    p1->next = NULL;
    scanf("%d", &k);
    p1 = head; p2 = p1;
    while (p1)
    {
        if (p1->num == k)
        {
            if (p1 == head)
            {
                head = p1->next;
                delete p1;   //修改
                p1 = head;  //修改
            }
            //else if (p1->next == NULL)//修改
            //    p2->next = NULL;      //修改
            else
            {
                           //p = p1; 修改
                p2->next = p1->next;
                delete p1;
                p1 = p2;    //修改
            }
        }
        else{         //修改
            p2 = p1;
            p1 = p1->next;
        }
    }
    p = head;
    while (p)
    {
        printf("%d ", p->num);
        p = p->next;
    }
    //p1 = p2 = head;  修改
    while (head)
    {
        p = head;        //修改
        head = head->next;//p1 = p1->next;
        delete p;        //修改
    }
    return 0;
}

if (p1 == head)
head = p1->next;
你不能修改head啊,改了就永远找不到链表头了