链接列表。更改poiner

时间:2016-05-31 04:19:41

标签: c pointers linked-list

我有userStack

类型的链接列表user
struct user {
    int id;                     // ID
    char login[20];             // login
    char password[32];          // password md5
    user *next;
};

用于向其添加节点的功能:

void addUser(user **userStack) {
    if (*userStack == NULL)
    {
        user *p = new user;
        *p = enterUser();
        p->next = NULL;
       *userStack = p;
    }
    else
    {
        user *p = new user;
        *p = enterUser(); / returns struct user (keyboard input)
        p->next = *userStack;
        *userStack = p;
    }
    printf("User is added successfully!\n");
}

user enterUser() {
     user *u = new user;
     int tmpID = -1;
     char tmpLogin[20];
     char tmpPass[20];
     char tmpPass2[20];
     std::string hashPass;
     system("cls");
     fflush(stdin);
     printf("Введите id пользователя: ");
     scanf("%d", &tmpID);
     while (isUserExists(tmpID) || tmpID < 0){
         fflush (stdin);
         if (isUserExists(tmpID))
             printf ("!!! Пользователь с таким id уже существует. \n");
         if (tmpID < 0)
             printf ("!!! ID пользователя не может быть отрицательным! \n");
         printf("Введите id пользователя: ");
         scanf ("%d", &tmpID);
     }
     u -> id = tmpID;
     fflush(stdin);
     printf("Введите имя пользователя: ");
     gets(tmpLogin);
     fflush(stdin);
     while (isUserExistsLogin(tmpLogin)){
         printf ("!!! Пользователь с таким именем уже существует. \n");
         printf("Введите имя пользователя: ");
         gets(tmpLogin);
         fflush(stdin);
     }
     strcpy(u -> login, tmpLogin);
     printf("Введите пароль пользователя: ");
     scanf ("%s", &tmpPass);
     printf ("Введите пароль повторно: ");
     scanf ("%s", &tmpPass2);
     while (strcmp(tmpPass, tmpPass2) != 0){
         if (strcmp(tmpPass, tmpPass2) != 0)
             printf ("!!! Пароли не совпадают!\n");
         printf("Введите пароль пользователя: ");
         scanf ("%s", &tmpPass);
         fflush (stdin);
         printf ("Введите пароль повторно: ");
         scanf ("%s", &tmpPass2);
     }
     hashPass = md5(tmpPass);
     strcpy(u->password, hashPass.c_str());
     printf("\n");
     return *u;
 }

当我添加第一个节点时,一切正常。

但是当我添加第二个和另一个时,我遇到了p->next = *userStack;行的问题。 此行正确更改指针但在password的末尾添加了垃圾。

那是我的麻烦。 感谢。

1 个答案:

答案 0 :(得分:0)

问题在于密码数组。增加长度解决了它。

感谢代码优化建议。