在C中按顺序插入linkedList

在C中按顺序插入linkedList,c,C,我正在尝试按照字符串的顺序在linkedList中插入一个节点。我相信指针有问题,因为我在运行程序时遇到了分段错误。该节点有两个数据字段:字符串的字符数组和表示数字的整数。列表只需要按名称排序 typedef struct node { char *name; int num; struct node *next; } Node; Node *head = NULL; int insertInOrder(char *newName, int favNum) { Node *

我正在尝试按照字符串的顺序在linkedList中插入一个节点。我相信指针有问题,因为我在运行程序时遇到了分段错误。该节点有两个数据字段:字符串的字符数组和表示数字的整数。列表只需要按名称排序

 typedef struct node {
  char *name;
  int num;
  struct node *next;
} Node;

Node *head = NULL;

int insertInOrder(char *newName, int favNum) {
  Node *current = head;
  Node *newNode;
  Node *tempNode;
  int nodeIn = 0;

  if (head == NULL) {
    head = malloc(sizeof(Node));
    if(head == NULL){
      fprintf(stderr, "ERROR: Out of memory\n");
      return 1;
    }
    head->name = newName;
    head->num = favNum;
    head->next = NULL;
  } else {
    while (current != NULL) {
      if (strcmp(newName, current->name) == 0) {
        fprintf(stderr, "ERROR: Name already exists in the list\n");
        return 1;
      }
      if (strcmp(newName, current->name) < 0) {
        tempNode = current->next;
        newNode = malloc(sizeof(Node));
        if(newNode == NULL){
          fprintf(stderr, "ERROR: Out of memory\n");
          return 1;
              }
        newNode->name = newName;
        newNode->num = favNum;
        newNode->next = tempNode;

        current->next = newNode;
        nodeIn = 1;
      }
      current = current->next;
    }
    if(nodeIn == 0){

      newNode = malloc(sizeof(Node));
      if(newNode == NULL){
        fprintf(stderr, "ERROR: Out of memory\n");
        return 1;
      }
      newNode->name = newName;
      newNode->num = favNum;
      current->next = newNode;
      newNode->next = NULL;
    }
  }
  return 0;
}
typedef结构节点{
字符*名称;
int-num;
结构节点*下一步;
}节点;
Node*head=NULL;
int insertinoder(char*newName,int favNum){
节点*电流=头部;
节点*新节点;
节点*临时节点;
int nodeIn=0;
if(head==NULL){
head=malloc(sizeof(Node));
if(head==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
head->name=newName;
head->num=favNum;
head->next=NULL;
}否则{
while(当前!=NULL){
if(strcmp(newName,current->name)==0){
fprintf(stderr,“错误:列表中已存在名称\n”);
返回1;
}
if(strcmp(newName,current->name)<0){
tempNode=当前->下一步;
newNode=malloc(sizeof(Node));
if(newNode==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
newNode->name=newName;
newNode->num=favNum;
newNode->next=tempNode;
当前->下一步=新节点;
nodeIn=1;
}
当前=当前->下一步;
}
if(nodeIn==0){
newNode=malloc(sizeof(Node));
if(newNode==NULL){
fprintf(stderr,“错误:内存不足\n”);
返回1;
}
newNode->name=newName;
newNode->num=favNum;
当前->下一步=新节点;
newNode->next=NULL;
}
}
返回0;
}

以下是您需要注意的代码缺陷--

1
if(head!=NULL)
{
如果(strcmp(newName,current->name)>0)也需要编写代码。
}

2.

如果第一个节点的strcmp(newName,current->name)<0,则需要在第一个节点之前插入节点,而不是在第一个节点之后插入节点

3.

while循环的任何迭代中插入新节点后,需要
while
循环中断开


我希望您会发现这些更正很有用。

以下是您的代码中需要注意的缺陷--

1
if(head!=NULL)
{
如果(strcmp(newName,current->name)>0)也需要编写代码。
}

2.

如果第一个节点的strcmp(newName,current->name)<0
,则需要在第一个节点之前插入节点,而不是在第一个节点之后插入节点

3.

while循环的任何迭代中插入新节点后,需要
while
循环中断开


我希望您会发现这些更正很有用。

确保您测试了所有这些案例--

  • 空列表

  • 列表中的第一个节点

  • 列表中列表数超过2的最后一个节点

  • 列表中两个项目之间的节点

  • 列表中的第二个节点

  • 列表中倒数第二个节点

通过“测试”所有这些情况,我不是指运行程序并看到它崩溃,我是指查看代码并理解代码在每种情况下的执行方式

我喜欢画一些盒子和箭头,当我看到它会做什么的时候。不要害怕一步一步地去做


查看上面的代码,我可以看到上面的许多情况您没有正确处理,因此我并不奇怪您会出现seg故障。

确保您测试了所有这些情况--

  • 空列表

  • 列表中的第一个节点

  • 列表中列表数超过2的最后一个节点

  • 列表中两个项目之间的节点

  • 列表中的第二个节点

  • 列表中倒数第二个节点

通过“测试”所有这些情况,我不是指运行程序并看到它崩溃,我是指查看代码并理解代码在每种情况下的执行方式

我喜欢画一些盒子和箭头,当我看到它会做什么的时候。不要害怕一步一步地去做


查看上面的代码,我可以看到上面的许多情况您没有正确处理,因此我对您出现seg故障并不感到惊讶。

您是否尝试运行
valgrind
并查看在哪一行出现分段故障?您是否可以显示对
insertinoder
的调用?我认为问题是存在的。如果数据字符串小于当前节点的数据字符串,则必须在currentnode之前插入,而不是在nextnode之前,并且新节点必须与前一个节点链接……而且逻辑也有缺陷,因为在插入节点后,您继续解析列表,而不是退出。因此,从这一点开始,新的数据节点将在每个节点上插入。您是否尝试运行
valgrind
并查看在哪一行出现分段错误?能否显示对
insertinoder
的调用?我认为问题是存在的。如果数据字符串小于当前节点的数据字符串,则必须在currentnode之前插入,而不是在nextnode之前,并且新节点必须与前一个节点链接……而且逻辑也有缺陷,因为在插入节点后,您继续解析列表,而不是退出。因此,从该点开始,将在每个节点上插入一个新的数据节点。