我想编写一个程序,该程序从用户那里获取最后提示的输入并按顺序打印它们。 以下是我遇到问题的代码段:
#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。我怎么能改变它?我究竟做错了什么?提前谢谢。
答案 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
希望这有帮助