我分配了一些处理链表的功能。这些功能是: insertFront-在列表的最前面放置一个新节点
insertBack-在列表的末尾放置一个新节点
打印-打印当前的链表
最大值-返回列表中的最大值
最小值-返回列表中的最小值
locInList-返回列表中的位置号码
我已经完成了代码,我认为它可以工作,但是我一直遇到分段错误。我知道这意味着我正在尝试访问不存在的内存部分。我无法弄清楚我在做什么错。
我已经尝试过分离和注释掉函数,并且在我运行打印函数之前,程序似乎运行良好。打印功能无法正常打印,我假设在我的max min和locInList函数中发生了分段错误。没有来自编译器的错误消息。
#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;
head = insertFront(head, 5);
head = insertFront(head, 4);
head = insertBack(head, 6);
head = insertBack(head, 7);
print(head);
printf("Max: %d\n", max(head));
printf("Min: %d\n", min(head));
printf("locInList 5: %d\n", locInList(head, 5));
printf("locInList 9: %d\n", 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 *tmp = malloc(sizeof(node));
tmp->data = d;
tmp->next = NULL;
if(head == NULL) return tmp;
node *end = head;
while(end->next != NULL){
end = end->next;
}
end->next = tmp;
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 = 0;
node *tmp = NULL;
tmp = head;
while(tmp->next != NULL){
if(tmp->data >= max){
max = tmp->data;
tmp = tmp->next;
}
}
return max;
}
int min (node* head)
{
int min = head->data;
node *tmp = NULL;
tmp = head;
while(tmp != NULL){
if(tmp->data <= min){
min = tmp->data;
tmp = tmp->next;
}
}
return min;
}
int locInList(node* head, int x)
{
int i = 0;
node *tmp = NULL;
tmp = head;
while(tmp != NULL){
if(tmp->data == x){
return i;
}else{
i++;
tmp = tmp->next;
}
}
return i;
}
答案 0 :(得分:2)
您的代码中存在多个错误,但以下是一个简单的错误:
node* insertFront(node* head, int d)
{
node *tmp = NULL;
tmp = malloc(sizeof(node));
tmp->data = d;
tmp->next = head;
return head; // Sure you want to return head ?
// The first time you call this function head is NULL
// and then you return NULL
// How about returning tmp instead
}
现在有一个更复杂的错误:
node* insertBack(node* head, int d)
{
node *tmp = NULL;
node *end = head;
tmp = malloc(sizeof(node)); // Why malloc two new nodes ?
end = malloc(sizeof(node)); // Your code shall only insert one new node
tmp->data = d;
tmp->next = NULL;
while(end->next != NULL){
end = end->next;
end->next = tmp; // Here you destroy the list by inserting
// the new node in incorrect places.
// You don't want to do this until
// the end has been reached
}
return head; // Again ... this is bad when called the first time
}
尝试以下方法:
node* insertBack(node* head, int d)
{
node *tmp = malloc(sizeof(node));
tmp->data = d;
tmp->next = NULL;
if (head == NULL) return tmp;
node *end = head;
while(end->next != NULL){
end = end->next;
}
end->next = tmp;
return head;
}
在函数max
,min
和locInList
中,您有一个不必要的tmp = malloc(sizeof(node));
会导致内存泄漏。
答案 1 :(得分:1)
node *tmp = NULL;
tmp = malloc(sizeof(node));
tmp = head;
此代码首先将tmp
设置为NULL
,然后将其设置为指向新分配的节点,然后将其设置为指向head
。我不知道您要做什么,但是连续将同一变量设置为三个不同的值可能不正确。
while(tmp->next != NULL){
if(tmp->data > max){
max = tmp->data;
tmp = tmp->next;
}
}
此代码仅将tmp = tmp->next;
为tmp->data > max
。那是不对的。一旦遇到比以前任何元素都小的元素,您将永远重复外部while
循环。
node *tmp = NULL;
node *end = head;
tmp = malloc(sizeof(node));
end = malloc(sizeof(node));
此代码将tmp
设置为NULL
,但是两行之后改变了主意,并将其设置为指向新分配的节点。它将end
设置为等于head
,但随后两行更改了主意并将其设置为指向新分配的节点。为什么将某项设置为一个值只是为了立即将其设置为另一个?为什么要在将一个节点添加到链接列表的函数中分配两个节点?
while(end->next != NULL){
end = end->next;
end->next = tmp;
}
您要将节点附加到列表的末尾。但是,当您从一个节点移动到另一个节点时,您会每次附加它!