关于链表的问题,如何解决?

sti.h下:
#include
#include
typedef struct node
{
    int date;
    struct node* next;   //指向下一个节点的指针
}NODE;
NODE* head = NULL;  //定义头指针
NODE* creatlist();
NODE* creatNode();
void printflist(NODE* headnode);
void insertnode(NODE* headnode, int date);
#include"sti.h"
int main() 
{
    NODE* list = creatlist();
    insertnode(list, 1);
    insertnode(list, 2);
    insertnode(list, 3);
    printflist(list);
    return 0;
}
NODE* creatNode(int date)
{
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->date = date;
    newnode->next = NULL;
    return newnode;
};
NODE* creatlist()    //创建新结点或说创建链表
{
    NODE* newnode = (NODE*)malloc(sizeof(NODE));   //创建新结点
    newnode->next = NULL;     //让newnode这个结点指向空
    return newnode;
}
void insertnode(NODE* headnode, int date)  //插入结点,参数:所要插入的链表,所要插入的结点的数据
{
    NODE* newnode = creatlist();    //创建插入的结点
    headnode->next = newnode;       //newnode放在headnode后面
    newnode->next = headnode->next; //newnode放在headnode->next后面
}
void printflist(NODE * headnode)    //打印结点
{
    NODE * pmove= headnode->next;
    while (pmove)
        {
        printf("%d", pmove->date);
        pmove = pmove->next;
        }
    printf("\n");
}

执行时是死循环,怎么修改?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在你的代码中,insertnode函数中创建了新的节点,但是并没有设置新节点的数据,导致每次插入新节点时,新节点的数据域都是随机值,所以程序会一直输出无限个随机数。另外,insertnode函数中的链表插入逻辑也有问题。

以下是修改后的代码:

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

typedef struct node
{
    int data;
    struct node* next;   //指向下一个节点的指针
}NODE;

NODE* creatNode(int data)
{
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->data = data;
    newnode->next = NULL;
    return newnode;
}

NODE* creatList()    //创建新结点或说创建链表
{
    NODE* head = creatNode(0);
    return head;
}

void insertNode(NODE* headnode, int data)  //插入结点,参数:所要插入的链表,所要插入的结点的数据
{
    NODE* newnode = creatNode(data);    //创建插入的结点
    newnode->next = headnode->next;    //让newnode指向headnode的下一个结点
    headnode->next = newnode;          //headnode指向newnode
}

void printList(NODE * headnode)    //打印链表
{
    NODE * pmove= headnode->next;
    while (pmove)
    {
        printf("%d ", pmove->data);
        pmove = pmove->next;
    }
    printf("\n");
}

int main() 
{
    NODE* head = creatList();
    insertNode(head, 1);
    insertNode(head, 2);
    insertNode(head, 3);
    printList(head);
    return 0;
}


修改的主要内容包括:

  1. 修改了节点的数据域名字,从date改为data。
  2. 修改了创建节点的函数creatNode,设置了节点的数据域。
  3. 修改了创建链表的函数creatList,让头节点的数据域为0,使头节点的数据域无意义。
  4. 修改了插入节点的函数insertNode,设置了新节点的next指针,保证插入的新节点放在链表的最前面。
  5. 修改了打印链表的函数printList,让其正确打印节点的数据域,而不是输出地址。

这样就可以正确地输出链表中的元素了。

以下答案引用自GPT-3大模型,请合理使用:

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int date;
    struct node* next;   //指向下一个节点的指针
}NODE;
NODE* head = NULL;  //定义头指针
NODE* creatlist();
NODE* creatNode();
void printflist(NODE* headnode);
void insertnode(NODE* headnode, int date);

#include"sti.h"
int main() 
{
    NODE* list = creatlist();
    insertnode(list, 1);
    insertnode(list, 2);
    insertnode(list, 3);
    printflist(list);
    return 0;
}
NODE* creatNode(int date)
{
    NODE* newnode = (NODE*)malloc(sizeof(NODE));
    newnode->date = date;
    newnode->next = NULL;
    return newnode;
};
NODE* creatlist()    //创建新结点或说创建链表
{
    NODE* newnode = (NODE*)malloc(sizeof(NODE));   //创建新结点
    newnode->next = NULL;     //让newnode这个结点指向空
    return newnode;
}
void insertnode(NODE* headnode, int date)  //插入结点,参数:所要插入的链表,所要插入的结点的数据
{
  NODE * curr = NULL;
  NODE* newnode = creatNode(date);    //创建插入的结点
  curr = headnode;
  while(curr->next != NULL)  // 找到链表最后一个结点
    {
        curr = curr->next;
    }
  curr->next = newnode; //将newnode链接到链表的尾部
  newnode->next = NULL;
}
void printflist(NODE * headnode)    //打印结点
{
    NODE * pmove= headnode->next;
    while (pmove !=NULL)
        {
        printf("%d", pmove->date);
        pmove = pmove->next;
        }
    printf("\n");
}

如果我的回答解决了您的问题,请采纳我的回答