创建节点问题,知道会发生段错误吗?

标签 c

知道发生了什么问题吗?

想法:

  1. 在链接列表的前面插入一个新节点。
  2. 创建一个新节点
  3. 传递新节点的函数地址来决定在前面插入。

谢谢。

struct Node{
    int data;
    struct Node *prev;
    struct Node *next;
}*HEAD, *TAIL;

int main(){
    int temp;
    printf(" |-> Insert front : ");
    scanf("%d", &temp);
    *tempNode = myInsert(temp);
    insertFront(tempNode);
}

Node myInsert(int num){

    // create new node
    Node *newNode = (Node*)malloc(sizeof(Node));
    newNode->data = num;
    newNode->prev = NULL;
    newNode->next = NULL;

    return *newNode;
}

void insertFront(Node *newOne){

    if(HEAD==NULL){
        printf(" |-> insertFront - HEAD : List empty, adding node - %d.\n", newOne->data);
        newOne->prev = newOne;
        HEAD = newOne;
    }
    else{
        // insert front
    printf(" |-> insertFront - List : Adding node - %d.\n", newOne->data);
        newOne->next = HEAD;
        HEAD->prev = newOne;
        HEAD = newOne;
    }
}

[1] 2947 段错误 ./a.out 失败:139

最佳答案

您提到的代码中存在一些问题,首先是这里

Node *newNode = (Node*)malloc(sizeof(Node));

节点是什么?您需要typedef struct Node。例如

typedef struct Node{
        int data;
        struct Node *prev;
        struct Node *next;
}Node; /* first typedef it */
Node *HEAD,*TAIL;

其次,这里

insertFront(tempNode);

您将 tempNode 传递给 insertFront(),并且在 insertFront() 中使用 tempNode 进行更改不会反射(reflect)在调用函数中,因为它视为按值调用。您需要传递tempNode的地址。例如

insertFront(&tempNode);

此外,myInsert() 应该返回 newNode 而不是 *newNode

尝试这个版本:

typedef struct Node{
        int data;
        struct Node *prev;
        struct Node *next;
}Node; /* first typedef it */
Node *HEAD,*TAIL;

Node* myInsert(int); /* declaration */
void insertFront(Node **); /* declaration */
void printNode(Node *); /* declaration */
int main(void){
        int temp;
        printf(" |-> Insert front : \n");
        scanf("%d", &temp);
        struct Node *tempNode;
        int itr;
        printf("enter no of nodes you want to insert onto list \n");
        scanf("%d",&itr);
        for(int i = 0;i< itr; i++) {
                tempNode = myInsert(temp);
                insertFront(&tempNode); /* need to pass address else changes in insertFront won't reflect here */
        }
        printNode(tempNode); /* fun for printing Node info*/
        return 0;
}

Node* myInsert(int num){
        // create new node
        Node *newNode = (Node*)malloc(sizeof(Node));
        newNode->data = num;
        newNode->prev = NULL;
        newNode->next = NULL;
        return newNode;
}

void insertFront(Node **newOne){
        if(HEAD==NULL){
                printf(" |-> insertFront - HEAD : List empty, adding node - %d.\n", (*newOne)->data);
                //newOne->prev = newOne; /* not required as myInsert() already did this */
                HEAD = *newOne;
        }
        else{
                // insert front
                printf(" |-> insertFront - List : Adding node - %d.\n", (*newOne)->data);
                (*newOne)->next = HEAD;
                HEAD->prev = (*newOne);
                HEAD = (*newOne);
        }
}
void printNode(Node *temp) {
        while(temp) {
                printf("%d\t",temp->data);
                temp = temp->next;
        }
}

关于创建节点问题,知道会发生段错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54015774/

相关文章:

c++ - 为什么你不能对 C 中的指针进行按位运算,有没有办法解决这个问题?

c - 解析选项的开关盒

c - 替换链表中的节点值

objective-c - isNan( ) 是如何工作的?

c - 如果函数正在运行,如何从数组中取出该函数?

c++ - 将指针传递给 C 项目中的 C++ 函数

c - 为什么 union 整数中的垃圾值?

c - 使用 fgets 和 strtok 并尝试打印创建的节点时出现 NULL 节点或空格

c - 减慢模拟器速度

c - 如何使用预处理器识别 Linux 上的 64 位构建?