qq_52716023 2022-10-10 17:08
浏览 13
已结题

链表的插入标准问题?

问题遇到的现象和发生背景

想要编写一个服务器,然后保存客户端信息用的是链表,但是当新的用户加进来时,一直遍历不到链表尾节点,每次都是从第一个节点后面开始插入的,也不知道什么问题。

用代码块功能插入代码,请勿粘贴截图

void *login(void *arg)
{
char buf[50];
MESS regist=malloc(sizeof(mess));
MESS p=head;
char buf_name[10];//用户名
char buf_account[10];//账号
char buf_password[10];//密码
int connfd = *(int *)arg;

send(connfd,"1.Login 2.Register",20,0);//给客户端反馈信息,是登录还是注册
recv(connfd,buf,2,0);
printf("buf:%s\n",buf);

if(!strcmp(buf,"1"))//判断登录还是注册
{
    send(connfd,"Please enter a user name",30,0);
    recv(connfd,buf_name,10,0);
    send(connfd,"Please enter a password",30,0);
    recv(connfd,buf_password,10,0);
    while (1)
    {
        p=p->next;
        //验证用户与密码是否相符
        if(((strcmp(p->name,buf_name)==0||strcmp(p->account,buf_name)==0)&&strcmp(p->account,buf_name)==0))
        {
            send(connfd,"login success",30,0);
            printf("login success\n");
            send(connfd,"quit",11,0);
            break;
        }
        else
        {
            send(connfd,"login fail",30,0);
            printf("login fail\n");
            send(connfd,"quit",11,0);
            break;
        }
    }
    
}
else if(!strcmp(buf,"2"))//这里是注册
{
    send(connfd,"please input your name",30,0);
    recv(connfd,buf_name,20,0);
    send(connfd,"please input your password",30,0);
    recv(connfd,buf_password,20,0);
    long acc=rand()%89999+10000;//随机生成账号
    sprintf(buf_account,"%ld",acc);//将账号转化为字符串
    printf("buf_account:%s\n",buf_account);
    sprintf(buf,"%s %s %s",buf_name,buf_account,buf_password);//将新用户信息进行拼接
    printf("%s\n",buf);
    int ret=fprintf(fd,"%s\n",buf);
    if(ret==-1)
    {
        perror("printf error\n");
    }
    while (1)
    {
        p=p->next;//问题就在这里,每次遍历到第一个节点后面就是NULL;第一个节点后面还有数据
        if((strcmp(p->name,buf_name)==0||strcmp(p->account,buf_name)==0))
        {
            send(connfd,"register fail",30,0);
            printf("register fail\n");
            send(connfd,"quit",11,0);
            break;
        }
        if(p->next == NULL);//然后就在第一个节点后面开始插入数据
        {
            show_user(head);
            printf("p_name:%s\n",p->name);
            char input[10];
            strcpy(regist->name,buf_name);
            strcpy(regist->account,buf_account);
            strcpy(regist->password,buf_password);
            p->next=regist;
            regist->next=NULL;
            send(connfd,"register success",30,0);
            printf("register success\n");
            while (1)
            {
                scanf("%s",input);
                send(connfd,input,11,0);
                if((strcmp(input,"quit")==0))
                    break;
            }
            break;
            
        }
    }
}

pthread_exit(NULL);

}

运行结果及报错内容

我在主函数就遍历了整个链表第一句就是链表里面的信息
最后做插入的时候却只有第一个节点和新插入的节点

img

我的解答思路和尝试过的方法

我猜测是线程函数传参的问题,我将表头定义为全局变量,在函数中都能将链表很好的输出,一到遍历尾节点插入就不行了;

我想要达到的结果

想找到一个链表插入的标准规范。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月18日
    • 创建了问题 10月10日

    悬赏问题

    • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
    • ¥15 电脑蓝屏logfilessrtsrttrail问题
    • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
    • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
    • ¥15 Java+vue部署版本反编译
    • ¥100 对反编译和ai熟悉的开发者。
    • ¥15 带序列特征的多输出预测模型
    • ¥15 Python 如何安装 distutils模块
    • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
    • ¥15 资源泄露软件闪退怎么解决?