c - 链表程序没有正确更新

标签 c linked-list xdebug

我创建了一个读取包含整数的文本文件的程序。它应该读入这些整数,然后创建它们的链表。但是,我的程序的头指针会不断更新,即使尾部应该更新也是如此。有人知道为什么吗?输入文件可以是用空格或换行符分隔的整数。这是我的代码:

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

/*THIS IS THE BASIC NAME STRUCTURE. IT CONTAINS A FIRST AND LAST NAME VARIABLE*/
struct number {
    int * number;          //number
};
/*THIS IS THE BASIC NAME NODE STRUCTURE. IT CONTAINS A NAME STRUCT AS WELL AS STRUCT NAMENODES TO PREVIOUS AND NEXT NODES*/

struct numberNode {
    struct number number;          //name stuct call

    struct numberNode *pNext;    //pointer to next node
    struct numberNode *pPrev;    //pointer to previous node

};

/*THESE NAMENODES WILL BE USED THROUGHOUT THE PRGRAM AS THE HEAD AND TAIL OF THE PROGRAM*/
struct numberNode *pHead = NULL, *pTail=NULL;



/*THIS PROGRAM READS A FILE AND PLACES THE NAMES INTO LINKED LIST*/
void insert_end(int *num)

{

    struct numberNode *var = NULL,*temp = NULL;                   //set temp nodes

    var=(struct numberNode *)malloc(sizeof(struct numberNode));     //allocate memory for new node

    var->number.number= num;                         //set number of number stored in node





    if(pHead==NULL){                                            //check if it is the head


        pHead=var;                                              //set node to head b/c of first element

        pHead->pPrev=NULL;                                      //set node next and prev to null

        pHead->pNext=NULL;

        pTail=pHead;                                            //make head and tail the same

    }else{

        pTail=pHead;                                        //set tail to head

        while(pTail!=NULL)                                  //while tail is not NULL

        {

            temp=pTail;                                     //set temp node to tail pointer

            pTail=pTail->pNext;                             //traverse the linked list

        }

        pTail=var;                                          //set ptail to correct node

        temp->pNext=pTail;                                  //set the temps next to tail

        pTail->pPrev=temp;                                  //set the tail's previous pointer to temp

        pTail->pNext=NULL;                                  //set tail next to NULL

    }


}



/*FUNCTION FOR DISPLAYING LINKED LIST DATA*/
void display(){
    struct numberNode *node;
    node=pHead;
    printf("Displaying Linked List \n ************************************** \n");
    while(node != NULL){
        printf("Number is %d\n", *node->number.number);
        node = node->pNext;
    }
    printf("List is terminated\n ************************************* \n");
}

void displayBackwards(){
    struct numberNode *node;
    node=pTail;
    printf("Displaying Linked List Backwards \n ************************************** \n");
    while(node != NULL){
        printf("Number is %d\n", *node->number.number);
        node = node->pPrev;
    }
    printf("List is terminated\n ************************************* \n");
}




/*DELETE NODE PASSED IN ARGUEMENT*/
void deleteNode(struct numberNode *node){
    if (node!= pHead){
        node->pPrev->pNext=node->pNext;
        node->pNext->pPrev=node->pPrev;
        node->pNext = NULL;
        free(node);
    }else{
        pHead->pNext = pHead;
        free(node);
    }
}

//SWITCH THE LOCATIONS OF THE TWO NODES PASSED AS ARGUEMENTS
void switchNodes(struct numberNode *leftNode, struct numberNode *rightNode){
    struct numberNode temp;
    temp = *leftNode;
    leftNode->number=rightNode->number;
    rightNode->number= temp.number;

}

/*ORGANIZE LINKED LIST IN ALPHABETICAL ORDER*/
void organizeInAscendingOrder(){
    struct numberNode *node = pHead;
    int length=0;
    while(node != NULL){
        node = node->pNext;
        length ++;
    }
    node = pHead;
    int index = 0, secondIndex = 0;
    for (index=0; index<length; index++){
        for (secondIndex=0; secondIndex<length-1; secondIndex++){
            if(node->number.number > node->pNext->number.number){
                switchNodes(node, node->pNext);
            }
            node=node->pNext;
        }
        node=pHead;
    }
}

/*PUSH NODE PASSED AS ARGUEMENT TO THE BACK*/
void pushToBack(struct numberNode *node){
    pTail->pNext = node;
    deleteNode(node);
}


int main() {


    char file[100];
    printf("Enter input file ");
    scanf("%s", file);
    FILE *in_file = fopen(file, "r");


    int number;

    char *buffer;



    while(fscanf(in_file,"%d", &number)!=EOF)

    {

        insert_end(&number);
    }

    display();

    organizeInAscendingOrder();

    display();

    displayBackwards();


}

最佳答案

正如 Paul 所说,您不一定需要这两个结构,但真正的问题是,当您从文件中读取一个 int 时,您存储在变量“int number;”中。每次调用函数 insert_end(&number);您发送变量 number 的地址,但在您的 insert_end 函数中,您将新节点中新数字的值分配给 number 的地址: var->number.number= num;.因此,在您的列表中,您的 numberNode 中的所有数字元素都将指向相同的地址。

一个快速的解决方法是为文件中读取的每个整数分配新的内存空间。 例如:

int* number = (int*)malloc(sizeof(int));

while(fscanf(in_file,"%d", number)!=EOF)

{
    insert_end(number);
    number = (int*)malloc(sizeof(int));
}

您还可以按照 Paul 的建议从结构中删除指针:

struct numberNode {
    int number;                  //number
    struct numberNode *pNext;    //pointer to next node
    struct numberNode *pPrev;    //pointer to previous node
 };

希望对你有帮助

[编辑]:+1 给 fhsilva,他提出了一种更好的管理尾部的方法,头部应始终引用列表的第一个元素,尾部应始终指向最后一个元素。这样你就不会在最后插入列表了,因为你已经有了对最后一个元素的引用。(我无法评论 fhsilva 的回答,因为我刚刚订阅了 SO,没有足够的声誉...)

詹姆斯

关于c - 链表程序没有正确更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26365993/

相关文章:

ruby - 如何在 Ruby 中反转链表

c - 链表C编程错误插入新元素

C 将 int 分解为数字并将其存储在链表中

php - Xdebug 问题 : Time-out connecting to client (waited: 200 ms). :-(

c - 将 SDL_Surface* 初始化为函数

c - 仅 Unix 编译器的错误消息

c - 线程、事件循环和大量的连接和并发

比较 C 中数组的内容

xdebug - 如何安装旧版本的 Xdebug

php - 如何启用 Xdebug 功能