我之前已经发布了类似的内容,但这是我遇到的问题的另一部分,我会很感激你的想法,如果你能帮助我解决我的错误。
正如我的标题所述,我正在构建一个双向链接列表,我想知道我的函数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;
}
我没有提供完整的代码,因为它很长,这就是我发布重要内容的原因。 如果我的问题不明确,请告诉我。
由于
答案 0 :(得分:2)
这是一个问题:
while ((temp!=NULL) && (temp->data!=loc))
temp-> data!= loc不比较字符串,它只是比较指针地址。 您可以使用strcmp或类似的字符串比较函数。 strcmp如果返回非零 这两个参数不同。
while ((temp!=NULL) && (strcmp(temp->data, words))
请注意,要words
与列表中的值进行比较,因为words
是loc
之后要插入的值。
如果使用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)
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
您无法比较此类字符串temp->data!=loc
。你实际上在比较地址。将此行更改为以下内容:
while((temp != NULL) && (strcmp(temp->data, loc) != 0));
var->next=temp1
不正确。我们在列表的末尾,所以这一行应该重写如下:
var->next = NULL;