【问题标题】:Linked List Insertion in CC中的链表插入
【发布时间】:2013-12-01 19:22:33
【问题描述】:

我想编写一个程序,它接受用户最后提示的输入并按顺序打印它们。 这是我有问题的代码sn-p:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
//#include <termios.h>

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#define MAXCHARNUM 128
#define MAXARGNUM 32

char *argsexec[MAXARGNUM];
char str[500];
char *path;
char *name;
int length;
int sizeOfHistory=0;

struct History{
    char *hname;
    struct History *nextPtr;
    struct History *prevPtr;
}*nextPtr=NULL,*prevPtr=NULL;


struct History *Head = NULL;
struct History *Tail = NULL;
struct History *Temp = NULL;
struct History *Temp2 = NULL;
struct History *historyTemp = NULL;

void HistoryList(char *historyName){

    struct History *historyTemp = (struct History *)malloc(sizeof(struct History));

    if(sizeOfHistory == 0)
    {
        historyTemp->hname=historyName;
        historyTemp->prevPtr = NULL;
        historyTemp->nextPtr = NULL;
        Tail = historyTemp;
        Head = historyTemp;
        sizeOfHistory++;
        printf("Histtemp's :%s ",historyTemp->hname);
        printf("Head's name: %s ",Head->hname);
        printf("Tail's name: %s ",Tail->hname);
    }



    else if (sizeOfHistory < 10){

        historyTemp->hname=historyName;
        historyTemp->prevPtr = NULL;
        historyTemp->nextPtr = NULL;


        Head->prevPtr = historyTemp;
        historyTemp->nextPtr = Head;
        Head = historyTemp;
        sizeOfHistory++;
        printf("Head's name: %s ",Head->hname);

    }

    else{
        historyTemp->hname=historyName;
        Head->prevPtr = historyTemp;
        historyTemp->nextPtr = Head;
        Head = historyTemp;
        Tail=Tail->prevPtr;
        Temp=Tail->nextPtr;
        Tail->nextPtr = NULL;
        Temp->prevPtr = NULL;
        free(Temp);
    }
    //historyTemp=NULL;
}

void printHistory(){

    int counter=1;
    struct History *historyT=NULL;
    historyT = Head;

    while(historyT != NULL){
        printf("[%d] [%s] \n",counter,historyT->hname);
        historyT=historyT->nextPtr;
        counter++;
    }
}


void Setup(){

    while(1){


        while (!feof(stdin))
        {
            fgets(str, sizeof(str), stdin);
            HistoryList(str);
        }

    }
}

int main(int argc, char const *argv[])
{
    Setup();
    return 0;
}

通常在程序从用户那里获得第二次输入后,它应该只更改 historyTemp 的 hname。

但它也改变了头部和尾部。我怎样才能改变它?我究竟做错了什么?提前致谢。

【问题讨论】:

    标签: c list shell unix pointers


    【解决方案1】:

    您没有为 historyName 分配任何内存

    代替

    historyTemp->hname=historyName;
    

    historyTemp->hname=strdup(historyName);
    

    您至少在一个位置分配了 Head->previous。没有意义。

    不能完全弄清楚你的插入逻辑吗?

    这就是我要做的事情

    假设在尾部插入

    我会做临时工

    如果是第一次插入,则设置head为temp

    设置 Tail-> 在 temp 旁边 将 temp->previous 设置为 Tail 将 temp->next 设置为 NULL

    希望对你有帮助

    【讨论】:

    • 帮助很大。谢谢
    猜你喜欢
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2012-12-29
    • 1970-01-01
    • 2015-10-20
    • 2020-12-11
    • 1970-01-01
    相关资源
    最近更新 更多