C中的链接列表插入

时间:2013-12-01 19:22:34

标签: c list shell unix pointers

我想编写一个程序,该程序从用户那里获取最后提示的输入并按顺序打印它们。 以下是我遇到问题的代码段:

#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。

但它也改变了Head和Tail。我怎么能改变它?我究竟做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:1)

您没有将任何内存分配给historyName

而不是

historyTemp->hname=historyName;

DO

historyTemp->hname=strdup(historyName);

您至少在一个地方指定了Head-&gt; previous。毫无意义。

无法完全列出您的插入逻辑?

这就是我要做的事情

假设在Tail插入

我会做一个临时的

如果是第一个插入,则将头设置为temp

在temp旁边设置Tail-&gt; 设置temp-&gt;之前的Tail 将temp-&gt;设置为NULL

希望这有帮助