添加新用户到c程序列表
我只是想编写一个简单的函数来将朋友添加到UserAccount列表中。 所有信息都通过参数提供。 如果用户已经在列表中,我不需要再次添加他,但显示记录表明他已经在列表中。 我写了这段代码。 不确定这是否正确,是否有任何改进代码的建议? 这有用吗?
int add_friend(UserAccount* user, char Circle, UserAccount* friend) { struct UserAccountNode *p; p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); while (p != NULL) if(stricmp(user, p->friend) == 0){ p->next = head; // inserting at the beginning head = p; } else { printf("%d already exists", friend) }; }
“不确定这是否正确” – 它是否符合您的预期? 如果是的话,那可能是正确的; 如果不。 好…
不,它远没有接近正确。 错误的列表是废弃所有错误的理想案例。 这些事情包括(但不限于):
-
您声称要有条件地添加新朋友,但前提是他们尚未在列表中。 然而,你做的第一件事是为你甚至不确定你需要的东西分配空间?
-
你的循环没有可能满足的退出条件(除非
malloc()
实际上失败 )。 在任何时候都是p
,唯一的退出条件参数,在函数的第一行之后分配给任何东西 ,它为它分配一个你甚至可能不需要的动态分配。 即你有一个无限循环。 -
您将
UserAccount*
传递给stricmp
作为第一个参数,它需要一个const char*
。 -
您正在将
p->friend
与user
进行比较。 但你刚刚分配了p
指向的内容。 它的friend
成员是不确定的,即没有已定义的内容,但是您将未定义的内容发送到stricmp()
以与输入参数user
进行比较。 这会调用未定义的行为 。 -
比较逻辑是向后的。 如果字符串不区分大小写,则
stricmp()
返回0; 没有什么不同 您的逻辑(即使您没有因为上面提到的上述项目而调用未定义的行为)至少只是在项目已经存在时才尝试将项目添加到列表中。 -
在列表中进行两次迭代后,如果通过某种奇迹将if-expression评估为true两次,则创建了一个循环自引用节点,并将您最初进入深渊的任何列表孤立。
-
您正在向具有
"%d"
格式说明符的printf
发送friend
,UserAccount*
。 虽然这可能不会使您的程序崩溃 ,但它仍然是未定义的行为。 如果要使用printf()
打印指针值,请使用"%p"
-
事实上,未使用的function参数是您最不担心的。 它们可能没有被使用过,但从正面看,它们同样没有被错误地使用;
user
和friend
不能说的东西。
关于“努力工作”或“不错的尝试”,我不会为你发光。 这个代码甚至没有机会编译 ,绝对没有机会正常运行。 您需要查看您尝试实现的实际算法,并在C中大量审查指针和动态内存的使用情况。
您的代码至少有两个问题:
-
while (p != NULL)
如果
p
不是NULL
,那么这将是一个无限循环,因为您不会在循环体中更改p
或使用break
这样的语句来跳出它。 -
stricmp(user, p->friend)
您使用的是未初始化的变量
p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode));
只分配了一个结构,但是在
while
循环中使用它之前永远不会初始化它。
其他错误是可能的,例如你从不使用friend
参数, stricmp()
的参数可能是错误的,等等。