添加新用户到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->frienduser进行比较。 但你刚刚分配了p指向的内容。 它的friend成员是不确定的,即没有已定义的内容,但是您将未定义的内容发送到stricmp()以与输入参数user进行比较。 这会调用未定义的行为

  • 比较逻辑是向后的。 如果字符串不区分大小写,则stricmp()返回0; 没有什么不同 您的逻辑(即使您没有因为上面提到的上述项目而调用未定义的行为)至少只是在项目已经存在时才尝试将项目添加到列表中。

  • 在列表中进行两次迭代后,如果通过某种奇迹将if-expression评估为true两次,则创建了一个循环自引用节点,并将您最初进入深渊的任何列表孤立。

  • 您正在向具有"%d"格式说明符的printf发送friendUserAccount* 。 虽然这可能不会使您的程序崩溃 ,但它仍然是未定义的行为。 如果要使用printf()打印指针值,请使用"%p"

  • 事实上,未使用的function参数是您不担心的。 它们可能没有被使用过,但从正面看,它们同样没有被错误地使用; userfriend不能说的东西。

关于“努力工作”或“不错的尝试”,我不会为你发光。 这个代码甚至没有机会编译 ,绝对没有机会正常运行。 您需要查看您尝试实现的实际算法,并在C中大量审查指针和动态内存的使用情况。

您的代码至少有两个问题:

  1. while (p != NULL)

    如果p不是NULL ,那么这将是一个无限循环,因为您不会在循环体中更改p或使用break这样的语句来跳出它。

  2. stricmp(user, p->friend)

    您使用的是未初始化的变量

     p = (struct UserAccountNode *) malloc(sizeof(struct UserAccountNode)); 

    只分配了一个结构,但是在while循环中使用它之前永远不会初始化它。

其他错误是可能的,例如你从不使用friend参数, stricmp()的参数可能是错误的,等等。