双重链接列表插入功能后

时间:2013-12-24 23:44:57

标签: c

我之前已经发布了类似的内容,但这是我遇到的问题的另一部分,我会很感激你的想法,如果你能帮助我解决我的错误。

正如我的标题所述,我正在构建一个双向链接列表,我想知道我的函数insert_after是否有效。当我运行完整代码时,我无法在我选择的值之后插入,这就是我发布这个的原因。如果我不清楚或者是否错误地询问了这个问题,请告诉我。我是C的新手,只需要你帮助理解。

这是我的结构:

 struct node
 {
  char data[100];
  struct node *previous;  // Points to the previous node
  struct node *next;   // Points out to the next node
 }*head, *last;

这是我在所选词后插入的函数:

 char insert_after(char words[99], char loc[99])
 {
  struct node *temp, *var, *temp1;
  var=(struct node *)malloc(sizeof(struct node));
  strncpy(var->data, words,100);

  if (head==NULL)
  {
    head=var;
    head->previous=NULL;
    head->next=NULL;

  }
  else
  {
    temp=head;
    while ((temp!=NULL) && (temp->data!=loc))
    {
        temp=temp->next;
    }
    if (temp==NULL)
    {
        printf("\n %s not presented at list\n", loc);
    }
    else
    {
        temp1=temp->next;
        temp->next=var;
        var->previous=temp;
        var->next=temp1;
        temp1->previous=var;
    }
  }
  last=head;
  while (last->next!=NULL)
  {
    last=last->next;
  }
  return 0;// take it out after
 }

这是我的主要内容: - >案例3是我的问题

 int main()
 {
char loc[99];
char words[99];
int i, dat;

head=NULL;

printf("Select the choice of operation on link list");
printf("\n1.) Insert At Begning\n2.) Insert At End\n3.) Insert At Middle");
printf("\n4.) Delete From End\n5.) Reverse The Link List\n6.) Display List\n7.)Exit");

   while(1)
  {
    printf("\n\n Enter the choice of operation you want to do ");
    scanf("%d",&i);

    switch(i)
    {
        case 1:
        {
            printf("Enter a word you want to insert in the 1st node ");
            scanf(" %s",words);

            insert_beginning(words);
            display();
            break;
        }
        case 2:
        {
            printf("Enter a word you want to insert in the last node ");
            scanf(" %s",words);
            insert_end(words);
            display();
            break;
        }
        case 3:
        {
            printf("After which data you want to insert your new data ");
            scanf(" %s",words);

            printf("Enter the data you want to insert in list ");
            scanf(" %s",loc);

            insert_after(words, loc);
            display();
            break;
        }

我没有提供完整的代码,因为它很长,这就是我发布重要内容的原因。 如果我的问题不明确,请告诉我。

由于

3 个答案:

答案 0 :(得分:2)

这是一个问题:

while ((temp!=NULL) && (temp->data!=loc))

temp-> data!= loc不比较字符串,它只是比较指针地址。 您可以使用strcmp或类似的字符串比较函数。 strcmp如果返回非零 这两个参数不同。

while ((temp!=NULL) && (strcmp(temp->data, words))

请注意,要words与列表中的值进行比较,因为wordsloc之后要插入的值。

如果使用char数组作为insert_after函数的参数,则需要注意确保正确初始化数组的整个长度。

请注意,如果列表中只有一个节点,则需要检查以下节点(在这种情况下,以下节点将为NULL)。

char insert_after(char *words, char *loc)
 {
  struct node *temp, *var;
  var=(struct node *)malloc(sizeof(struct node));
  strcpy(var->data, loc);

  if (head==NULL)
  {
    head=var;
    head->previous=NULL;
    head->next=NULL;

  }
  else
  {
    temp=head;
    while ((temp!=NULL) && (strcmp(temp->data, words)))
    {
        temp=temp->next;
    }
    if (temp==NULL)
    {
        printf("\n %s not presented at list\n", words);
    }
    else
    {
        struct node * followingNode = temp->next;
        temp->next=var;
        var->previous=temp;
        var->next= followingNode;
        if (followingNode)
        followingNode->previous = var;
    }
  }
}

答案 1 :(得分:1)

您必须使用memcmp或更好的strcmp进行字符串比较,而不是!=

答案 2 :(得分:1)

问题

  1. char words[99]有99个元素,但您最多允许100个元素strncpy(var->data, words,100);。如果words'\0'终止,则可能会出现问题。您可以无意中将word[99]写入var->data,这不应该被允许。将语句更改为:

    strncpy(var->data, words, 99);
    var->data[99] = '\0'; // In case words wasn't a string
    
  2. 您无法比较此类字符串temp->data!=loc。你实际上在比较地址。将此行更改为以下内容:

    while((temp != NULL) && (strcmp(temp->data, loc) != 0));
    
  3. var->next=temp1不正确。我们在列表的末尾,所以这一行应该重写如下:

    var->next = NULL;