我目前正在尝试编程一个函数,该函数将把一个新元素放到列表的顶部,并将列表的其余部分推回去。。。有人能帮我吗?当我试图编译和运行程序时,它不起作用。它会无限循环。有什么帮助吗?
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
/* linked lists of strings */
typedef struct sll sll;
struct sll {
char *s;
sll *next;
};
/* By convention, the empty list is NULL. */
/* sll_cons : (char*, sll*) -> sll* */
/* build new list with given string at the head */
/* note: copy the given string to the list (deep copy) */
sll *sll_cons(char *s, sll *ss) {
while (ss != NULL) {
char* temp;
temp = malloc(sizeof(char)*strlen(ss->s));
temp = ss->s;
ss->s = s;
ss->next = malloc(sizeof(char)*strlen(ss->s));
ss->next->s = temp;
ss->next->next = NULL;
ss = ss->next;
}
return ss;
}
我想在这里提到三件事。
第1点。您没有检查malloc()
是否成功。您正在立即取消引用返回的指针。如果malloc()
失败,您将面临UB。[ss->next->s
]
第2点。在while循环中,将内存分配给ss->next
后,将其放入ss
,然后检查是否为NULL,对于malloc()
的成功,这通常不会为TRUE。
第3点。temp = ss->s;
不,这不是执行深度复制的方式。你必须使用strcpy()
。否则,将内存分配给temp
是没有意义的。