c-链表(非常介绍)InsertBack


#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
typedef struct node node;
node* insertFront(node* head, int d);
node* insertBack(node* head, int d);
void print(node* head);
int max(node* head);
int min(node* head);
int locInList(node* head, int x);
int main()
{
node* head = NULL;
node* temp = NULL;
head = malloc(sizeof(node));
head = insertBack(head, 5); 
head = insertFront(head, 4);
head = insertFront(head, 3);
head = insertBack(head, 6);
head = insertBack(head, 7);
print(head);
printf("nMax: %dn", max(head));
printf("Min: %dn", min(head));
printf("locInList 5: %dn", locInList(head, 5));
printf("locInList 9: %dn", locInList(head, 9));    
return 0;
}
node* insertFront(node* head, int d)
{
node *tmp = NULL;
tmp = malloc(sizeof(node));
tmp->data = d;
tmp->next = head;
head = tmp;
return head;
}
node* insertBack(node* head, int d)
{
node *ptr;
ptr->data=d;
ptr->next = NULL;
if(head==NULL)
{
head->data=d;
head->next=NULL;
}
else
{
node *temp=head;
while(temp->next != NULL)
{
temp=temp->next;
}
temp->next=ptr;
}
return head;
}
void print(node* head)
{
node *tmp = head;
while(tmp != NULL)
{
printf("%d ", tmp->data);
tmp = tmp->next;
}
}
int max (node* head)
{
int max;
while (head != NULL)
{
if (max > head->data)
max = head->data;
}
return max;
}
int min (node* head)
{
int min;
while (head != NULL)
{
if (min < head->data)
min = head->data;
}
return min;
}
int locInList(node* head, int x)
{
}

我的InsertBack函数有问题,我想把d的值加到头的末尾。

我用这个代码得到的当前输出是:

3 4 0 7 7 7 7 7.7 7 7…正在重复

输出应该像这个

34567最大值:7最小值:3

如有任何帮助,我们将不胜感激。我对链表也很陌生。所以任何帮助都将不胜感激!!

此处为

node* insertBack(node* head, int d)
{
node *ptr;
ptr->data=d;       // Dereference uninitialized pointer !!
ptr->next = NULL;  // Dereference uninitialized pointer !!
if(head==NULL)
{
head->data=d;      // Dereference NULL pointer !!
head->next=NULL;   // Dereference NULL pointer !!
}

你有个大问题。你没有分配内存!因此,您正在取消引用一个未初始化的指针。太糟糕了。

尝试:

node* insertBack(node* head, int d)
{
node *ptr = malloc(sizeof *ptr);
ptr->data=d;
ptr->next = NULL;
if(head==NULL) return ptr;
...

对于初学者来说,这句话在主的开头

head = malloc(sizeof(node));

没有道理。您创建了一个未初始化的节点。因此,如果您试图对列表执行除释放分配的内存之外的任何操作,则程序已经调用了未定义的行为。

删除此语句。

您忘记为函数insertBack中的节点分配内存。

node* insertBack(node* head, int d)
{
node *ptr;
ptr->data=d;
ptr->next = NULL;
//...

也是if语句的主体

if(head==NULL)
{
head->data=d;
head->next=NULL;
}

没有道理。

如果保持函数声明不变,那么它的定义可以如下所示

node * insertBack( node *head, int d )
{
node *ptr = malloc( sizeof( node ) );
ptr->data = d;
ptr->next = NULL;
if ( head == NULL )
{
head = ptr;
}
else
{
node *temp = head;
while ( temp->next != NULL )
{
temp = temp->next;
}
temp->next = ptr;
}
return head;
}

还有这些功能

int max (node* head)
{
int max;
while (head != NULL)
{
if (max > head->data)
max = head->data;
}
return max;
}
int min (node* head)
{
int min;
while (head != NULL)
{
if (min < head->data)
min = head->data;
}
return min;
}

无效,因为至少有变量max和min未初始化。此外,它们有一个无限循环,例如函数max在列表中找不到最大值。:(

最好像这个一样声明它们

int max ( node* head, int *value );

在这种情况下,函数max的定义可能看起来像

int max( node* head, int *value )
{
int success = head != NULL );
if ( success )
{    
*value = head->data;
while ( ( head = head->next ) != NULL )
{
if ( *value < head->data ) *value = head->data;
}
}
return success;
} 

该函数可以像一样调用

int max_value;
if ( max( head, &max_value ) )
{
printf( "The maximum value is %dn", max_value );
}

可以用相同的方式声明和定义函数min。

如果保持函数声明不变,那么您至少必须将变量初始化为0。例如

int max (node* head)
{
int max = head == NULL ? 0 : head->data;
for ( ; head != NULL; head = head->next )
{
if ( max < head->data ) max = head->data;
}
return max;
}

类似的方式可以定义函数min。尽管正如我所指出的,当函数以我上面展示的方式定义时会更好。

并且不要忘记编写一个函数来释放所有分配的内存。

相关内容

  • 没有找到相关文章

最新更新