大学生的单链表输出异常的疑问


#include
#include
#include
typedef int DataType;
typedef struct Node {
    DataType data;  // 数据元素
    Node* next;   //后继结点指针
}Node;
Node* CreatList(DataType a[], int n)//尾插法建立链表
{
    Node* first = NULL, * rear = NULL,*s=NULL;
    first = (Node*)malloc(sizeof(Node));
    rear = first;
    for (int i = 0; i < n; i++)
    {
        s = (Node*)malloc(sizeof(Node));
        s->data = a[i];
        rear->next = s;
        rear = s;
    }
    rear->next = NULL;
    return first;
}
int Insert(Node* first, int i, DataType x)//按位插入
{
    Node* rear = first;
    for (int a = 0; a < i - 1; a++)
    {
        if (rear == NULL)
        {
            printf("位置错误,插入失败\n");
            return 0;
        }
        else
            rear = rear->next;//找到第i-1位
    }
    Node* s = (Node*)malloc(sizeof(Node));
    s->data = x;
    s->next = rear->next;
    rear->next = s;
    return 1;
}
int Insert2(Node* first, DataType x)//按值插入,递增有序
{
    Node* rear = first->next;
    if (rear == NULL)
    {
        printf("空表,插入失败\n");
        return 0;
    }
    Node* p = first;//用于保存rear之前的一个结点
    while (rear->data <= x)
    {
        if (rear->next == NULL)
        {
            p = rear;
            break;
        }
        else
        {
            p = rear;
            rear = rear->next;
        }
    }//跳出循环时即rear->data>x或者x大于所有结点的数据
    Node* s = (Node*)malloc(sizeof(Node));
    s->data = x;
    s->next = p->next;
    p->next = s;
    return 1;
}
int Delete(Node* first, int i, DataType* ptr)//按位删除
{
    Node* p = first, * q = NULL; int count = 0;
    while (p != NULL && count < i - 1)    
    {
        p = p->next;
        count++;
    }
    if (p == NULL || p->next == NULL)
    { 
        printf("位置错误,删除失败\n "); 
        return 0;
    }
    else
    {
        q = p->next;
        *ptr = q->data;             
        p->next = q->next;                         
        free(q); 
        return 1;
    }
}
int Delete2(Node* first, DataType x)//按值删除
{
    Node*space=NULL,*rear=first->next;
    Node* p = first;
    int count = 0;
    while (rear!= NULL)
    {
        if (rear->data == x)
        {
            space = rear;
            p->next = rear->next;
            rear = rear->next;
            free(space);
            count++;
        }
        else
        {
            p = rear;//rear之前的结点
            rear = rear->next;
        }
    }
    if (count == 0)
    {
        printf("删除失败\n");
        return 0;
    }
    else
        return 1;
}
void PrintList(Node* first)//遍历输出
{
    int count = 0;
    Node* p = first->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
        count++;
    }
    if (count == 0)
        printf("表已销毁,没有输出\n");
    else
        printf("\n");
}
void DestroyList(Node* first)//单链表的销毁
{
    Node* p = first->next;
    Node* space = NULL;
    while (p != NULL)
    {
        space = p;
        p = p->next;
        free(space);
      
    }
}
int main()
{
    int a[9] = { 1,2,3,4,5,6,7,8,9 };
    int n = 9;
    int p=0;
    Node *list=CreatList(a,  n);
    PrintList(list);
    Insert2(list, 11);
    PrintList(list);
    Insert(list, 11, 99);
    PrintList(list);
    Insert(list, 4, 88);
    PrintList(list);
    Delete(list, 3, &p);
    PrintList(list);
    Delete2(list, 9);
    PrintList(list);
    DestroyList(list);
    PrintList(list);
    return 0;
}

如上代码,在输出时显示了异常,说引发了异常: 读取访问权限冲突。
p 是 0xD。求问为什么会这样,怎么改啊