C语言 VScode 链表 第二个定义的结构体变量(作为结点)异常

结构体定义


typedef struct LNode
{  
    ElemType data;  
    struct LNode *next;
}LNode,LinkList;

img

声明结构体变量

LinkList LA, LB, LC, LD, LE;

img

运行到断点处,检查每个结构体变量的成员

img

第二个变量 LB 的成员与其他几个都不同,而且不仅有头结点,还有头结点后的一个结点

更改顺序

img

同样是第二个变量异常

奇怪

完整代码

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100

typedef int ElemType;
typedef int Status;

typedef struct LNode
{  
    ElemType data;  
    struct LNode *next;
}LNode,LinkList;

Status InitList(LinkList *L);  //初始化单链表
Status ClearList(LinkList *L);  //清空单链表
int Listlength(LinkList L);  //求单链表的长度
Status GetElem(LinkList L, int i, ElemType *e);  //返回第i个结点的值
LNode *LocateList(LinkList L, ElemType e);  //返回第一个数据与e相等的结点的指针
Status ListInsert(LinkList *L, int i, ElemType e);  //在第i个结点前插入数据e
Status ListDelete(LinkList *L, int i, ElemType *e);  //删除第i个数据结点
Status ListTraverse(LinkList L);  //输出单链表中的数据

Status Union(LinkList *La, LinkList Lb);  //集合并
Status Intersection(LinkList *La, LinkList Lb);  //集合交
Status Difference(LinkList *La, LinkList Lb);  //集合差
Status MergeList(LinkList La, LinkList Lb, LinkList *Lc);  //有序表合并
Status Purge(LinkList *Lc);  //去除重复元素

Status Restore(LinkList *L, int a[], int t); //生成,还原数据

int main()
{
    int a[] = {2, 8, 27, 39, 66, 77, 89};
    int b[] = {6, 18, 27, 59, 65, 77, 89, 120, 140};
    LinkList LA, NO, LB, LC;
    InitList(&LA);
    InitList(&LB);
    Restore(&LA, a, 7);
    Restore(&LB, b, 9);
    ListTraverse(LA);
    ListTraverse(LB);
    system("pause");
}

Status InitList(LinkList *L)
{
    L = (LinkList *)malloc(sizeof(LinkList));
    L->next = NULL;
    return OK;
}
Status ClearList(LinkList *L)
{
    LNode *p, *pn;
    p = pn = L->next ;
    L->next = NULL;
    while(p->next != NULL)
    {
        p = p->next;
        free(pn);
        pn = p;
    }
    free(p);
    return OK;
}
int Listlength(LinkList L)
{
    int t = 0;
    LNode *p;
    p = &L;
    while(p->next != NULL)
    {
        t++;
        p = p->next;
    }
    return t;
}
Status GetElem(LinkList L, int i, ElemType *e)
{
    LNode *p;
    p = &L;
    for(int j = 0; j < i; j++)
        p = p->next;
    *e = p->data;
    return OK;
}
LNode *LocateList(LinkList L, ElemType e)
{
    LNode *p;
    p = L.next;
    while (p->data != e)
        p = p->next;
    return p;
}
Status ListInsert(LinkList *L, int i, ElemType e)
{
    LNode *p, *pn;
    p = L->next;
    pn = L;
    if(Listlength(*L) == 0)
    {
        LNode *pe = (LNode *)malloc(sizeof(LNode));
        pe->data = e;
        L->next = pe;
        pe->next = NULL;
    }
    else if(Listlength(*L) != 0)
    {
        for(int j = 1; j < i; j++)
        {
            p = p->next;
            pn = pn->next;
        }
        LNode *pe = (LNode *)malloc(sizeof(LNode));
        pe->data = e;
        pn->next = pe;
        pe->next = p;
    }
    return OK;
}
Status ListDelete(LinkList *L, int i, ElemType *e)
{
    LNode *p, *pn;
    pn = L;
    p = L->next;
    for(int j = 1; j < i; j++)
    {
        p = p->next;
        pn = pn->next;
    }
    *e = p->data;
    pn->next = p->next;
    return OK;
}
Status ListTraverse(LinkList L)
{
    LNode *p;
    p = L.next;
    if(L.next == NULL)
    {
        printf("表为空");
        return OK;
    }
    while(p->next != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("%d", p->data);
    printf("\n");
    return OK;
}

Status Union(LinkList *La, LinkList Lb)
{
    LNode *p;
    p = La;
    while(p->next != NULL)
    {
        p = p->next;
    }
    p->next = &Lb;
    return OK;
}
Status Intersection(LinkList *La, LinkList Lb)
{
    LNode *pa, *pb;
    pa = La->next;
    pb = Lb.next;
    for(int i = 0; i < Listlength(*La); i++)
    {
        for(int j = 0; j < Listlength(Lb); j++)
        {
            if((pa->data != pb->data)&&(j == Listlength(Lb)))
                ListDelete(La, i + 1, NULL);
            else if(pa->data == pb->data)
                break;
        }
        pa = pa->next;
    }
    return OK;
}
Status Difference(LinkList *La, LinkList Lb)
{
    LNode *pa, *pb;
    pa = La->next;
    pb = Lb.next;
    for(int i = 0; i < Listlength(*La); i++)
    {
        for(int j = 0; j < Listlength(Lb); j++)
        {
            if(pa->data == pb->data)
            {
                ListDelete(La, i + 1, NULL);
                pb = pb->next;
                break;
            }
            pb = pb->next;
        }
        pa = pa->next;
    }
    return OK;
}
Status MergeList(LinkList La, LinkList Lb, LinkList *Lc)
{
    LNode *pa, *pb;
    int i = 0;
    pa = La.next;
    pb = Lb.next;
    while ((pa != NULL)||(pb != NULL))
    {
        if((pa == NULL)&&(pb != NULL))
        {
            pa = pb;
            break;
        }
        if(pa->data <= pb->data)
        {
            ListInsert(Lc, i, pa->data);
            pa = pa->next;
            i++;
            continue;
        }
        else 
        {
            ListInsert(Lc, i, pb->data);
            pb = pb->next;
            i++;
            continue;
        }
    }
    return OK;
}
Status Purge(LinkList *Lc)
{
    LNode *p, *pn;
    int i = 1;
    p = Lc->next->next;
    pn = Lc->next;
    while(p != NULL)
    {
        if(pn->data == p->data)
            ListDelete(Lc, i, NULL);
        p = p->next;
        pn = pn->next;
    }
    return OK;
}

Status Restore(LinkList *L, int a[], int t)
{
    if(L->next != NULL)
        ClearList(L);
    for(int i = 0; i < t; i++)
        ListInsert(L, i + 1, a[i]);
    return OK;
}


有一点小改动,不过问题还是一样

代码还是贴完整吧,部分代码看不出来