注册 登录
编程论坛 C语言论坛

双向链表问题,debug 在while((tmp->pnext) !=NULL) stm32会重启

j15506271841 发布于 2021-08-19 10:23, 1660 次点击

typedef struct {
    uint8_t title_num;
    DRAW_PARA *title;
    uint8_t content_num;
    DRAW_PARA *content;
}PAGE_DATA;

typedef struct page_config{

    uint8_t page_n;
    PAGE_DATA *temp;
    char (*pdata)[40];
    struct page_config *pnext;
    struct page_config *pprev;

}PAGE_CONFIG;


PAGE_CONFIG* initLine(PAGE_CONFIG * head){
  
    head=(PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
 
    head->pprev=NULL;
    head->pnext=NULL;

    PAGE_CONFIG * list=head;
   
    for (int i=0; i<5; i++) {
        
        PAGE_CONFIG * body=(PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
        body->pprev=NULL;
        body->pnext=NULL;
        body->temp = &page_data[i];
        body->page_n = i;
        body->pdata = NULL;
        
        list->pnext=body;
        body->pprev=list;
      
        list=list->pnext;
    }
    return head;
}

PAGE_CONFIG* InsertTailNode(PAGE_CONFIG * head){
   
   
    PAGE_CONFIG *tmp = head;
    if(head == NULL)return 0;
        
    while((tmp->pnext) !=NULL)
    {
        tmp = tmp->pnext;
        nnn++;
    }
   
    PAGE_CONFIG *tailnode = (PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
    if(tailnode == NULL)return 0;
   
   
        tailnode->pdata = NULL;
        tailnode->temp = NULL;
        tailnode->page_n = nnn+1;
    tmp->pnext = tailnode;
    tailnode->pprev = tmp;
    tailnode->pnext = NULL;
   
    return head;
}


    Head = initLine(Head);
    current = Head->pnext;.
程序运行到InsertTailNode 函数内的    while((tmp->pnext) !=NULL) 就飞了, 应该是InsertTailNode 函数写的有些问题,求大神分析下



4 回复
#2
我善治鬼2021-08-19 11:19
链表结构其实是现实中自行车链条的仿真, 只有文字没有图形是很难描述清楚的,
你应该使用画图软件将链表每一步动作都画出来, 才能确定哪里出了问题
#3
自由而无用2021-08-19 11:41
//https://www.bccn.net/run/

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

typedef unsigned char uint8_t;
typedef unsigned int  DRAW_PARA;

typedef struct {
    uint8_t title_num;
    DRAW_PARA *title;
    uint8_t content_num;
    DRAW_PARA *content;
}PAGE_DATA;

typedef struct page_config
{
    uint8_t page_n;
    PAGE_DATA *temp;
    char (*pdata)[40];
    struct page_config *pnext;
    struct page_config *pprev;
}PAGE_CONFIG;

PAGE_DATA page_data[10];

PAGE_CONFIG* initLine(PAGE_CONFIG *head)
{
  
    head = (PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
 
    head->pprev=NULL;
    head->pnext=NULL;

    PAGE_CONFIG *list=head;
//follow
    printf("head = %p next = %p\n", head, head->pnext);
    for (int i=0; i<5; i++) {
        PAGE_CONFIG *body=(PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
        body->pprev=NULL;
        body->pnext=NULL;
        body->temp = &page_data[i];
        body->page_n = i;
        body->pdata = NULL;
//follow
        printf("body = %p ", body);
        list->pnext = body;
        printf("pnext = %p ", list->pnext);
        
        body->pprev = list;
//follow      
        list=list->pnext;
        printf("list = %p\n", list);
    }
//follow
    printf("head = %p\n", head);
    return head;
}

PAGE_CONFIG* InsertTailNode(PAGE_CONFIG *head)
{
    int nnn = 0;
    PAGE_CONFIG *tmp = head;
    if(head == NULL)return 0;
      
    puts("enter InsertTailNode");
    printf("%p, %p\n", tmp, tmp->pnext);
//segment fault
    //tmp = tmp->pnext;

   
    while((tmp->pnext) != NULL) {
        tmp = tmp->pnext;
        nnn++;
    }
   
    printf("nnn = %d\n", nnn);
   
    PAGE_CONFIG *tailnode = (PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));
    if(tailnode == NULL)return 0;
   
    tailnode->pdata = NULL;
    tailnode->temp = NULL;
    tailnode->page_n = nnn + 1;
    tmp->pnext = tailnode;
    tailnode->pprev = tmp;
    tailnode->pnext = NULL;

    puts("exit InsertTailNode");
    return head;
}

int main(int argc, char *argv[])
{
    PAGE_CONFIG head, *nhead;
    nhead = initLine(&head);

//follow
    printf("%p, %p\n", &head, nhead);
   
    //InsertTailNode(&head);
//follow
    InsertTailNode(nhead);
    puts("end of main!");
   
    return 0;
}

[此贴子已经被作者于2021-8-19 12:32编辑过]

#4
自由而无用2021-08-19 12:33
print result:

head = 0x15ec010 next = (nil)
body = 0x15ed050 pnext = 0x15ed050 list = 0x15ed050
body = 0x15ed080 pnext = 0x15ed080 list = 0x15ed080
body = 0x15ed0b0 pnext = 0x15ed0b0 list = 0x15ed0b0
body = 0x15ed0e0 pnext = 0x15ed0e0 list = 0x15ed0e0
body = 0x15ed110 pnext = 0x15ed110 list = 0x15ed110
head = 0x15ec010
0x7ffcbfd88020, 0x15ec010
enter InsertTailNode
0x15ec010, 0x15ed050
nnn = 5
exit InsertTailNode
end of main!
#5
rjsp2021-08-19 14:56
PAGE_CONFIG* initLine(PAGE_CONFIG * head){

    head=(PAGE_CONFIG*)malloc(sizeof(PAGE_CONFIG));

这一句就不对了吧,你修改 head 这个临时变量干什么?
#6
j155062718412021-08-19 15:07
谢谢各位,代码我在网上抄的,是比较奇怪
#7
rjsp2021-08-19 15:17
程序代码:
#include <stdio.h>
#include <stdlib.h>

typedef struct page_config
{
    int value;

    struct page_config* next;
    struct page_config* prev;

} PAGE_CONFIG;

void list_pushback( PAGE_CONFIG** phead, int value )
{
    PAGE_CONFIG* prev = NULL;
    PAGE_CONFIG** ptail = phead;
    for( ; *ptail; prev=*ptail, ptail=&prev->next );

    (*ptail) = malloc( sizeof(PAGE_CONFIG) );
    (*ptail)->value = value;
    (*ptail)->prev = prev;
    (*ptail)->next = NULL;
}

void list_print( PAGE_CONFIG* phead )
{
    for( ; phead; phead=phead->next )
        printf( "%d%c", phead->value, " \n"[phead->next==NULL] );
}

int main( void )
{
    PAGE_CONFIG* head = NULL;
    list_print( head );

    list_pushback( &head, 0 );
    list_print( head );

    list_pushback( &head, 1 );
    list_print( head );

    list_pushback( &head, 2 );
    list_print( head );
}
1