求助,c语言双向循环链表销毁链表问题报错

gcc编译  DestroyList函数报错如下:


hello.c: In function ‘ClearList’:
hello.c:22:6: error: invalid type argument of ‘->’ (have ‘struct no11d’)
  (*L)->next = *L;
      ^
hello.c:23:6: error: invalid type argument of ‘->’ (have ‘struct no11d’)
  (*L)->prev = *L;

 

代码如下:

 

#include <stdio.h>

#include <stdlib.h>


 

typedef struct no11d

{

    int data;

    struct no11d* prev;

    struct no11d* next;

}node_t, *pnode_t;

 

void ClearList(pnode_t L)

{

    pnode_t p = L->next;//p指向链表第一个元素

    

    while(p != L)

    {

        p = p->next;

        free(p->prev);

    }

 

    (*L)->next = *L;

    (*L)->prev = *L;

}

 

void DestroyList(pnode_t *L)

{

    ClearList(*L);

    free(*L);

    *L = NULL;

}

 

void createLinklist(pnode_t *L)

{

    *L = (pnode_t)malloc(sizeof(node_t));

    if(*L == NULL)

        exit(0);

(*L)->data = -1;

    (*L)->prev = *L;

    (*L)->next = *L;

}

 

void create_feature_new_node(pnode_t *L, int data)

{

    *L = (pnode_t)malloc(sizeof(node_t));

 

    if (*L == NULL) {

        printf("create upload feature link list node error\n");

        exit(1);

    }

 

    (*L)->data = data;

    (*L)->prev = *L;

    (*L)->next = *L;

}

 

void InsertNodeHead(pnode_t phead, int data)

{

    pnode_t pnew = NULL;

    

    create_feature_new_node(&pnew, data);

    

    pnew->prev = phead;

    pnew->next = phead->next;

    phead->next->prev = pnew;   

    phead->next = pnew;

 

}

 

void printLinklist(pnode_t L)

{

    printf("3--------------\n");

while (L->next->data != -1) {

        L = L->next;

printf("%d\n", L->data);

}

printf("\n");

}

 

int main()

{

    pnode_t phead = NULL;

    createLinklist(&phead);

    printf("1--------------\n");

    InsertNodeHead(phead, 1);

    printf("2--------------\n");

    InsertNodeHead(phead, 2);

    InsertNodeHead(phead, 3);

    InsertNodeHead(phead, 4);

 

    printLinklist(phead);

    DestroyList(&phead);

}

 

 

看到你在问答里面提了一个问题 ,我有对应的课程专栏。希望能帮到你。
本人简介:https://blog.csdn.net/it_xiangqiang/article/details/115873169
C和C++完整教程:    https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:    https://blog.csdn.net/it_xiangqiang/category_10768339.html

ClearList的参数是指针,而DestroyList的参数是指针的指针,所以两个函数中对L的使用不能一样写法。clearList中不能用(*L)->的写法,因为*L不是指针了

我觉得完全不徐娅萍 pnode_t,因为它得好处不多(就节省一个星号)但带来困惑。我去掉它,调通了代码如下。发现数据是倒序。如果不向改变数据顺序,需要InsertNodeHead,吧新节点加到尾部。

 


#include <stdio.h>
#include <stdlib.h>

typedef struct no11d
{
    int data;
    struct no11d* prev;
    struct no11d* next;
}node_t;

void ClearList(node_t* L)
{
    node_t* p = L->next;//p指向链表第一个元素

    while(p != L)
    {
        p = p->next;
        free(p->prev);
    }

    L->next = L;
    L->prev = L;
}

 

void DestroyList(node_t* L)
{
    ClearList(L);
    free(L);
    L = NULL;
}


node_t* create_feature_new_node(int data)
{
    node_t*L = (node_t*)malloc(sizeof(node_t));

    if (L == NULL) {
        printf("create upload feature link list node error\n");
        exit(1);
    }

    L->data = data;
    L->prev = L;
    L->next = L;
    
    return L;
}

node_t* createLinklist()
{
    return create_feature_new_node(-1);
}

void InsertNodeHead(node_t* phead, int data)
{
    node_t* pnew =  create_feature_new_node(data);

    pnew->prev = phead;
    pnew->next = phead->next;
    phead->next->prev = pnew;   
    phead->next = pnew;
}

void printLinklist(node_t* L)
{
    printf("3--------------\n");
    while (L->next->data != -1) {
        L = L->next;
        printf("%d\n", L->data);
    }
    printf("\n");
}

int main()
{
    node_t* phead = createLinklist();

    printf("1--------------\n");
    InsertNodeHead(phead, 1);

    printf("2--------------\n");
    InsertNodeHead(phead, 2);
    InsertNodeHead(phead, 3);
    InsertNodeHead(phead, 4);

    printLinklist(phead);
    DestroyList(phead);
}

// Output
1--------------                                                                                                                                                                      
2--------------                                                                                                                                                                      
3--------------                                                                                                                                                                      
4                                                                                                                                                                                    
3                                                                                                                                                                                    
2                                                                                                                                                                                    
1