c-print从用户输入结构的链表



我需要有一个指向单词节点结构的句子节点结构列表。我正在尝试打印用户的输入。

当我手动输入时,我有一个程序可以正常运行(请参阅代码的测试部分(。然而,当我使用input1((函数时,它不起作用。

我试过调试它,但似乎找不到问题。我删除了所有用于调试的printf行。我还删除了所有不相关的代码。

我想知道如何修复它以及哪里出了问题,这样我就可以毫无问题地运行它。

我从调试中学到的是(只有在使用input1((时,而不是在测试中(每次头和所有节点都会被覆盖。我也试过用双指针代替para,但没有用。

任何帮助都将不胜感激,

提前感谢

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct word
{
char * ch;//poiter to char
}
W;
typedef struct sentence
{
W * currentWord;//pointer to a word
int lineNumber;// holds the line number
int numbersOfWords;//holds the number of words
struct sentence* link;
}
sent;
typedef struct list
{
sent* head;
int count;
}
LISTS;
LISTS* createList()
{
LISTS* list;
list= (LISTS*) malloc (sizeof (LISTS));
if (list)
{
list-> head = NULL;
list-> count = 0;
}
return list;
} // createList
void printList(LISTS*  list)
{
sent *temp = list -> head;
//iterate the entire linked list and print the data
while(temp != NULL)
{
printf("%sn", temp->currentWord->ch);
temp = temp->link;
}
//    printf("NULLn");
}
void insertSentList (LISTS* list, W* itemPtr)
{
sent* newPtr; //new node
if (!(newPtr = (sent * ) malloc(sizeof(sent)))){
printf(" Memory can not be allocated.");
return;
}
newPtr->currentWord = itemPtr;
newPtr->link = NULL;
if(list->head == NULL)
{
list->head = newPtr;
}else{
sent* current = list->head;
while(current->link != NULL){
current = current->link;
}
current -> link = newPtr;
}
(list->count)++;
return;
}  // insertList
LISTS * input1(LISTS *para)
{
char * line;
line = (char * ) malloc(1000 * sizeof(char));
line[0] = '';
while (line[0] != 'n')
{
W word;
word.ch = (char * ) malloc(100);
printf(" Please input a line : ");
fgets(line, 1000, stdin);
if(line[0] != 'n'){
strcpy(word.ch, line);
insertSentList(para,&word);
}
}
free(line);
return para;
}
int main()
{
///////////////////test////////////////
LISTS* list = createList();

W word;
word.ch= "word0 ";
W word1;
word1.ch= "word1 ";
W word2;
word2.ch= "word2";
insertSentList(list,&word);
insertSentList(list,&word1);
insertSentList(list,&word2);
insertSentList(list,&word);
insertSentList(list,&word1);
insertSentList(list,&word2);
printList(list);
///////////////////test////////////////
LISTS *para = createList();
para= input1(para);
printList(para);
return 0;
}

发布代码的主要问题是"所有权;列表中的CCD_ 1和CCD_。例如,main中的word.ch= "word0 ";将指向字符串文字的ch指针设置为(它不拥有(,但input1中的word.ch = malloc(100);将其指向动态分配的内存(它应该拥有,稍后请记住free(。正因为如此,内存分配不能被可靠地跟踪,即使在事情看起来"不稳定"的情况下;工作";,存在多个内存泄漏。当插入的对象是在列表对象的整个生命周期内不存在的局部变量时,它也会中断。

最简单的(如果不一定是最好或最高效的(解决方案是动态分配进入列表的所有对象,使列表拥有所有对象,并在完成后添加一个函数进行清理。为此,CCD_ 9可以被修改如下。

void insertSentList (LISTS* list, W* itemPtr)
{
sent* newPtr; //new node
if (!(newPtr = malloc(sizeof(sent)))){
printf(" Memory can not be allocated.n");
return;
}
W *newItem = malloc(sizeof(W));    // <-- make a deep copy of the `itemPtr` argument
newItem->ch = strdup(itemPtr->ch); //     including a copy of the string itself
newPtr->currentWord = newItem;     // <-- save the copy in the list, not the argument
newPtr->link = NULL;
if(list->head == NULL)
{
list->head = newPtr;
}else{
sent* current = list->head;
while(current->link != NULL){
current = current->link;
}
current->link = newPtr;
}
list->count++;
}  // insertList

为了正确清理并避免内存泄漏,应该为sent1返回并由insertSentList填充的每个列表指针调用以下freeList

void freeList(LISTS *list)
{
sent *temp = list->head;
while(temp != NULL)
{
sent *next = temp->link;
free(temp->currentWord->ch);
free(temp->currentWord);
free(temp);
temp = next;
}
free(list);
}

相关内容

  • 没有找到相关文章

最新更新