我正在尝试用c编写一个程序,以便从用户那里获得一个输入(字符)。用户应该能够输入他想输入的内容(‘’无限‘’)。
这是我最终写的程序,没有得到任何错误:
代码:
/*
main:
we will try to get an input from the user.
if we succeed, call insert function.
if we don't succeed, call freeList function.
if we encounter '\n' or EOF, we quit the program.
print the list, the free it.
insert (type void. does not return a value):
if allocation is successful, then we can put a new item in the linked list.
the item is a type node.
we don't care the number of nodes in the list.
if allocation is not successful, call free function.
free:
free the memory.
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct list *ptr;
typedef struct list{
char data;
ptr next;
}node; /*describes a linked list.*/
void insert(ptr *H, char c);
void freeList(ptr *H);
void printList(ptr *H);
int main(){
char c;
printf("enter a string\n");
ptr H=(ptr)malloc(sizeof(node));/*create an empty list. this is its head.*/
while ((c=getchar())!=EOF && c!='\n'){
insert(&H,c);
}
printList(&H); /*print the list*/
freeList(&H); /*free the list*/
printf("\n");
return 0;
}
void insert(ptr *H, char c){
ptr p1;
p1=*H;
ptr T=(ptr)malloc(sizeof(node)); /*try to allocate a new memory cell*/
if (!T)
{
printList(H);
freeList(H); /*we should not free H because we will
lose the list we've created.*/
}
else
{
T->data=c;
while(p1->next)
{
p1=p1->next;
}
p1->next=T; /*add T to the end of the linked list*/
}
}
void freeList(ptr *H){
ptr p1; /*helper pointer*/
while(*H){ /*while H points to a certain node*/
p1=*H;
(*H)=p1->next;
free(p1);
}
}
void printList(ptr *H){ /*a copy of H is sent so no problem working with it.*/
ptr p1=*H; printf("string is: \n");
while (p1) /*while H is not null */
{
printf("%c", p1->data);
p1=p1->next;
}
}这段代码实际上是可以工作的,但是任何反馈都是好的。
发布于 2013-12-22 02:23:31
尝试获取NULL指针的地址可能会导致分段错误-您应该将列表的HEAD设置为已分配的节点,而不是NULL指针。
通过gdb等调试器运行代码也很有用,调试器会告诉您导致分段错误的行(还会显示调用堆栈)。
解决警告应该相当简单。
flag未使用,因此可以将其删除。应向printList*H而不是H应向printListH而不是&H或者,您可以更改函数以接受ptrs而不是ptr *s,因为我认为没有理由传递node **s (这就是ptr *将变成的样子)。在这种情况下,应该是简单地将H传递给函数,而不用担心它们的指针类型(尽管,正如WhozCraig所说,这可能不是一个好主意)。
发布于 2013-12-22 02:48:40
这很可能就是你想要的,用代码中的注释来解释正在发生的事情。使用指针,更重要的是,指针到指针逻辑是...不寻常的..。你第一次接触到它的时候。希望这能有所帮助。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct list *ptr;
typedef struct list
{
char data;
ptr next;
} node;
void insert(ptr *H, char c);
void freeList(ptr *H);
void printList(ptr H);
int main()
{
ptr H = NULL;
int c;
printf("enter a string\n");
while (((c=getchar())!=EOF) && c!='\n')
insert(&H,(char)c);
printList(H); /*print the list*/
freeList(&H); /*free the list*/
printf("\n");
return 0;
}
void insert(ptr *H, char c)
{
// NOTE: while the pointer held in the pointer-to-pointer H
// is not NULL, move to the next pointer. Notice how we store
// the *address* of the 'next' member in our H variable as we
// walk. When we reach the end-of-list the value of the address
// held in the pointer whos address we're storing in H will be
// null. As a bonus, H will hold the address of the pointer we
// need to update, which we do.
while (*H)
H = &(*H)->next;
// allocate new node, assigning to the pointer
// dereferenced by the address held in *H
*H = malloc(sizeof(**H));
(*H)->data = c;
(*H)->next = NULL;
}
void freeList(ptr *H)
{
// NOTE: same logic as before. using H as a pointer-to-pointer
// to walk through the chain of pointers. each time we save the
// value to a temp, advance to the next pointer, and delete the
// saved value.
while (*H)
{
ptr tmp = *H;
*H = (*H)->next;
free(tmp);
}
}
void printList(ptr H)
{
// NOTE: No need for a pointer-to-pointer here.
while (H)
{
printf("%c", H->data);
H=H->next;
}
}尽管如此,我强烈建议完全消除ptr的思想,并简单地使用带有星号的适当声明的指针。C程序员希望看到这些。他们叫喊着,说“看!我是一个指针”=O
发布于 2013-12-26 20:19:07
递归freeList函数可以是
void freeList(ptr *H)
{
if(*H!=NULL)
{
freeList(&(*H)->next);
free(*H);
}
}类似地,可以重写printList和insert
https://stackoverflow.com/questions/20721877
复制相似问题