저는이 코드를 시도하고 있습니다. 때때로 작동하지만 가끔은 잘 동작하지 않습니다! 구조체에 대한 포인터를 반환하는 함수를 만든 다음 새 구조체에 단어를 추가하는 함수 (추가)를 만듭니다.여기에 무슨 문제가 있습니까? [동적 구조 C]
typedef int boolean;
boolean first = TRUE;
typedef struct s_Reg
{
char *str;
struct s_Reg *next;
} Reg;
Reg* CreateList()
{
Reg *list = (Reg*)malloc(sizeof(Reg));
list -> str = (char*)malloc(sizeof(char));
if (list != NULL && list -> str)
return list;
else
return NULL;
}
boolean Add(Reg *list, char *str)
{
Reg *pos = list;
if (first == TRUE)
{
list -> str = (char*)malloc(sizeof(char));
if (list -> str != NULL)
{
list -> str = str;
list -> next = NULL;
first = FALSE;
}
else
return FALSE;
}
else
{
while (pos -> next != NULL)
pos = pos -> next;
pos -> next = (Reg*)malloc(sizeof(Reg));
if (pos -> next != NULL)
{
pos = pos -> next;
pos -> str = (char*)malloc(sizeof(char));
if (pos -> str != NULL)
{
pos -> str = str;
pos -> next = NULL;
}
else
return FALSE;
}
else
return FALSE;
}
return TRUE;
}
int main()
{
boolean b;
int i;
char *str;
Reg *words = CreateList();
str = malloc(sizeof(char));
if (words == NULL)
return -1;
for (i = 1; i <= 3; ++i)
{
printf("\nword: ");
gets(str);
b = Add(words, str);
if (b == FALSE)
return -1;
str = malloc(sizeof(char));
}
while (words != NULL)
{
printf("Word: %s\n", words -> str);
words = words -> next;
}
free(str);
str = NULL;
free(words);
words = NULL;
return 0;
}
내가
Add(words, "blablablablablabla");
Add(words, "blablaasfsafdblblablaasfbla");
Add(words, "blablaasfsafdblblablaasfblaasdfasfasdf");
그것은 잘 때마다 작동 (데이터를 삽입하는 사용하지 않는) 이렇게 할 경우! 하지만 FOR를 사용하여 데이터를 삽입하면 긴 문자열을 삽입하는 경우가 있습니다!
/////// ** 편집 //////// **
글쎄, 내가 모든 질문을 읽고, 당신에게 모두 감사합니다. 코드를 다시 작성하고 작동하는 것 같습니다 (그러나 더 좋을 수 있다고 생각합니다)
이것은 내 최종입니까? 코드 :
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define TRUE 1
#define FALSE -1
typedef int boolean;
boolean first = TRUE;
typedef struct s_Reg
{
char *str;
char *str2;
char *str3;
struct s_Reg *next;
} Reg;
Reg* CreateList()
{
Reg *list = (Reg*)malloc(sizeof(Reg));
if (list != NULL)
return list;
else
return NULL;
}
boolean Add(Reg *list, char *str, char *str2, char *str3)
{
Reg *pos = list;
if (first == TRUE)
{
list -> str = (char*)malloc(strlen(str) + 1);
list -> str2 = (char*)malloc(strlen(str2) + 1);
list -> str3 = (char*)malloc(strlen(str3) + 1);
if (list -> str == NULL || list -> str2 == NULL || list -> str3 == NULL)
return FALSE;
sprintf(list -> str, str);
sprintf(list -> str2, str2);
sprintf(list -> str3, str3);
list -> next = NULL;
first = FALSE;
}
else
{
while (pos -> next != NULL)
pos = pos -> next;
pos -> next = (Reg*)malloc(sizeof(Reg));
if (pos -> next != NULL)
{
pos = pos -> next;
pos -> str = (char*)malloc(strlen(str) + 1);
pos -> str2 = (char*)malloc(strlen(str2) + 1);
pos -> str3 = (char*)malloc(strlen(str3) + 1);
if (pos -> str == NULL || pos -> str2 == NULL || pos -> str3 == NULL)
return FALSE;
sprintf(pos -> str, str);
sprintf(pos -> str2, str2);
sprintf(pos -> str3, str3);
pos -> next = NULL;
}
else
return FALSE;
}
return TRUE;
}
int main()
{
boolean b;
int i;
char str[64], str2[64], str3[64];
Reg *words = CreateList();
if (words == NULL)
return -1;
for (i = 1; i <= 3; ++i)
{
printf("\nstr1: ");
gets(str);
printf("\nstr2: ");
gets(str2);
printf("\nstr3: ");
gets(str3);
b = Add(words, str, str2, str3);
if (b == FALSE)
return -1;
}
while (words != NULL)
{
printf("str1: %s\n", words -> str);
printf("str2: %s\n", words -> str2);
printf("str3: %s\n\n", words -> str3);
words = words -> next;
}
free(words);
words = NULL;
return 0;
}
충돌이 발생하면 어떤 메시지가 나타 납니까? 디버거에서 프로그램을 단계별로 실행 해 보았습니까? 또는 도움이되는'printf' 문을 추가하여 진행 상황을 모니터 할 수 있습니까? –