Aa_ohodsg 2023-04-18 20:33 采纳率: 50%
浏览 29
已结题

向链表中插入新元素的函数的问题

刚开始学习c,想要完成一个向链表插入新元素的函数但老是遇到问题。实在不知道为啥执行不了只能向大家请教了。

#include <stdio.h>
#include<stdlib.h>
#include <string.h>




typedef struct users{
  int indicator;
  int numoffriend;
  char name[50];
  char relation[50][100];
  struct users* next;
}users;

struct users* headpointerglobal;
struct users* pointerglobal;

void insert(char name[50], int* numofuser,struct users** headpointerglobal){
  struct users* cur_node;
  struct users* pre_node;
  struct users* new_node;
  int result;
  int volume = sizeof(struct users*);

  new_node = (struct users*)malloc(volume);
  strcpy(new_node->name,name);
  if(*headpointerglobal == NULL){
    *headpointerglobal = new_node;
    printf("%p\n",&new_node);
    printf("%p\n",new_node);
    printf("1");
    new_node->next = NULL;
    printf("1");
    *numofuser++;
    new_node->indicator = 1;
    printf("%d\n",*numofuser);
    printf("%s\n",new_node->name);
  }
  else{
    printf("1");
    cur_node = *headpointerglobal;
    pre_node = NULL;
    int i =0;
    while(cur_node != NULL && strcmp(name,cur_node->name)<0 && i <*numofuser){
      printf("here");
      pre_node = cur_node;
      cur_node = cur_node->next;
      i++;
    }
    new_node->next = cur_node;
    if(pre_node == NULL){
      *headpointerglobal = new_node;
    }
    else{
      pre_node->next = new_node;
    }
    *numofuser++;
  }
}


void main(){
  char username[50];
  int volume = sizeof(struct users*);
  int choice;
  int numberofuser = 0;
  int clock;
  struct users* pointer;
  pointer->next = NULL;
  printf("1");
  while(clock<5){
    clock++;
    printf("enter choice\n");
    scanf("%d",&choice);
    if(choice == 1){
      printf("enter username\n");
      scanf("%s",username);
      insert(username,&numberofuser,&headpointerglobal);
    }
    else{
      if(choice ==2){
        break;
      }
    }
  }
}

现在遇到的问题就是当程序执行到new_node->next = NULL;这一行就不执行了但也不报错就直接退出程序了有没有懂的朋友帮忙看看是什么问题以及编程的思路有没有错,谢谢大家。

  • 写回答

2条回答 默认 最新

  • SVEN-chr 2023-04-18 20:41
    关注

    在代码中,有一个悬空指针引用的问题,这可能是导致程序异常退出的原因。具体来说,在main函数中,声明了一个指向users结构体的指针"pointer",但并没有给它分配任何内存,也没有将其指向任何有效的结构体。接着,在下一行语句"pointer->next = NULL"中,你试图通过指针来访问其next成员,这是不安全的操作,因为你不能确定指针指向的内存是否有效,这可能导致程序异常退出。

    此外,在插入函数中,你将numofuser指针递增时,使用了错误的语法,应该改为 (*numofuser)++。

    以下是修改后的代码:

    #include <stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    typedef struct users{
        int indicator;
        int numoffriend;
        char name[50];
        char relation[50][100];
        struct users* next;
    }users;
    
    struct users* headpointerglobal;
    
    void insert(char name[50], int* numofuser,struct users** headpointerglobal){
        struct users* cur_node;
        struct users* pre_node;
        struct users* new_node;
        int volume = sizeof(struct users);
    
        new_node = (struct users*)malloc(volume);
        strcpy(new_node->name,name);
        if(*headpointerglobal == NULL){
            *headpointerglobal = new_node;
            printf("%p\n",new_node);
            printf("1");
            new_node->next = NULL;
            printf("1");
            (*numofuser)++;
            new_node->indicator = 1;
            printf("%d\n",*numofuser);
            printf("%s\n",new_node->name);
        }
        else{
            printf("1");
            cur_node = *headpointerglobal;
            pre_node = NULL;
            int i =0;
            while(cur_node != NULL && strcmp(name,cur_node->name)<0 && i <*numofuser){
                printf("here");
                pre_node = cur_node;
                cur_node = cur_node->next;
                i++;
            }
            new_node->next = cur_node;
            if(pre_node == NULL){
                *headpointerglobal = new_node;
            }
            else{
                pre_node->next = new_node;
            }
            (*numofuser)++;
        }
    }
    
    int main(){
        char username[50];
        int choice;
        int numberofuser = 0;
        int clock = 0;
        struct users* pointer = NULL;
        headpointerglobal = NULL;
        printf("1");
        while(clock<5){
            clock++;
            printf("enter choice\n");
            scanf("%d",&choice);
            if(choice == 1){
                printf("enter username\n");
                scanf("%s",username);
                insert(username,&numberofuser,&headpointerglobal);
            }
            else{
                if(choice ==2){
                    break;
                }
            }
        }
        return 0;
    }
    
    

    这段代码会在每次运行时,提示用户输入1或2。如果用户输入1,那么程序会提示用户输入用户名,将该用户插入到链表中;如果用户输入2,程序会退出。在插入函数中,你的代码似乎尝试按照用户名字典序将新的用户节点插入到链表中,这个逻辑看起来没问题。现在修改后的代码应该可以运行了,你可以尝试输入几个用户名,看看它是否能正确地将它们插入链表中。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分