Я очень близок к выполнению этого школьного задания по связанному списку, но у меня проблемы с самой последней функцией. Цель этой функции — взять числа, прочитанные из текстового файла, и поместить их в связанный список в порядке номеров. Я попытался добраться до того места, где он проходит через список, и узел добавляется всякий раз, когда значение больше предыдущего числа, но достиг ошибки сегментации. Я застрял на этом в течение смущающе долгого времени и был бы признателен за чью-либо помощь. Ниже приведены файлы, с которыми я работаю, и ужасный беспорядок функции с именем insertStrategic, которая должна получить список в порядке номеров.
ГЛАВНОЕ
#include "linkedlist.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main (){
NodePtr newNode = NULL;
// after you implemented your functions in .cpp file
// - use the code below for testing your linked list.
// Demonstrate that ALL functions are working correctly.
// After that add code for reading data from input file.
// Every time you read an integer, create a node and insert it
// in the ascending order into the list.
int num;
FILE *fptr;
// make sure file exists, give message and exit otherwise
if ((fptr = fopen("input.txt","r")) == NULL){
printf("Error! opening file");
exit(1);
}
// while we still have items to read
while( fscanf(fptr,"%d", &num) != EOF){
newNode = makeNewNode(num);
insertStrategic(newNode);
}
fclose(fptr); // close the file
// At the end print the entire list to show that your code
// functions correctly.
printList();
cout << "After DeleteFromFront: " << endl;
deleteFromFront();
printList();
NodePtr seven = makeNewNode(7);
insertAtEnd(seven);
cout <<"Inserting seven at END" << endl;
printList();
NodePtr eight = makeNewNode(8);
insertAtEnd(eight);
cout <<"Inserting eight at END" << endl;
printList();
cout << "After deleting eight: " << endl;
deleteFromEnd();
printList();
cout << "After deleting seven:" << endl;
deleteFromEnd();
printList();
return 0;
}
ФАЙЛ СВЯЗАННОГО СПИСКА
#include "linkedlist.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
NodePtr head = NULL;
NodePtr tail = NULL;
bool isEmpty(){
return (head == NULL);
}
NodePtr makeNewNode(int number){
NodePtr newNode = (NodePtr) malloc(sizeof(Node));
if(newNode != NULL){
newNode->data = number;
newNode->next = NULL;
}
return newNode;
}
void insertAtFront(const NodePtr newPtr){
if (isEmpty()){
head = newPtr;
tail = newPtr;
}
else{ // not empty
newPtr->next = head;
head = newPtr;
}
}
void insertAtEnd(const NodePtr newPtr){
NodePtr end = head;
newPtr->next = NULL;
while (end->next != NULL){
end = end->next;
}
end->next = newPtr;
}
void insertStrategic(const NodePtr newPtr){
if (isEmpty()){
head = newPtr;
tail = newPtr;
}
else {
NodePtr traverse = head;
newPtr->next = NULL;
while ((traverse->next = NULL)){
while ((traverse->data < newPtr->data)){
traverse = traverse->next;
}
traverse = traverse->prev;
traverse->next = newPtr;
break;
}
}
}
void deleteFromFront( ){
NodePtr temp = head;
head = head->next;
}
void deleteFromEnd( ){
NodePtr temp = head;
NodePtr secTemp;
while(temp->next != NULL) {
secTemp = temp;
temp = temp->next;
}
free(secTemp->next);
secTemp->next = NULL;
}
void printList( ){
if (isEmpty()){
cout << "List is empty" << endl;
}
else {
NodePtr temp = head;
while (temp != NULL){
cout << " The data is: " << temp->data << endl;
temp = temp->next;
}
}
}
ЗАГОЛОВОЧНЫЙ ФАЙЛ
#ifndef MYLIST_H
#define MYLIST_H
#include <cstddef>
struct listNode {
int data;
struct listNode* prev;
struct listNode* next;
};
typedef struct listNode Node;
typedef Node* NodePtr;
static int nodeCount = 0;
bool isEmpty();
NodePtr makeNewNode(int);
void insertAtFront(const NodePtr);
void insertAtEnd(const NodePtr);
void insertStrategic(const NodePtr);
void deleteFromFront( );
void deleteFromEnd( );
void printList();
#endif
ТЕКСТОВЫЙ ФАЙЛ ДЛЯ ЧТЕНИЯ
3
5
11
2
7
1
65
12
3
45
6
while ((traverse->next = NULL))
. (Если вы добавили круглые скобки, чтобы избавиться от предупреждения компилятора, вам следует пересмотреть этот выбор. Предупреждение было важным.) - person molbdnilo   schedule 07.02.2020node->prev
значением null (или реализовать конструктор и использоватьnew
вместоmalloc
), на самом деле вы вообще никогда не устанавливаетеprev
- person Alan Birtles   schedule 07.02.2020using namespace std
... - person Aconcagua   schedule 07.02.2020Node
? Тогда вам не нужен этот typedef.struct Node { Node* prev; Node* next; };
полностью допустимо в C++ (в отличие от C, где вам нужно ключевое слово struct...). - person Aconcagua   schedule 07.02.2020LinkedList
? Тогда вы можете иметь несколько списков одновременно. Все те функции, которые у вас сейчас есть как автономные, получат функции-члены, например:class LinkedList { Node* head; Node* tail; public: void insertAtFront(Node const* ptr); /*... */ };
- person Aconcagua   schedule 07.02.2020void insert(const NodePtr)
эквивалентноvoid insert(Node* const)
, не —void insert(Node const*)
, т.е. е. только указатель является константой, не объект, на который указывает (предположительно, это то, что вы на самом деле хотели...). Кроме того, было бы лучше просто передать данные (в данном случаеint
) и создать узлы внутри функции... - person Aconcagua   schedule 07.02.2020nullptr
) старым (устаревшим?) макросам C (NULL
). - person Aconcagua   schedule 07.02.2020new
+ конструктор вместоmalloc
): кроме того, вы больше никогда неfree
свои узлы, поэтому вы ввели утечку памяти... - person Aconcagua   schedule 07.02.2020