mayashah Ответов: 2

Функция размера связанного списка ?


here i have problem i think in the size function i want to have the size of the whole linked list before and after deletion basically, the size function says error that "size must return value" and return value does not match return type !! cheers for help !! Thanks


В основном я выделил недостаток !!

Что я уже пробовал:

//SLL Basic insert , delete and search functions

#include<iostream>
using namespace std;

/* defines the structure of a single linked list node*/
typedef struct list_node {
    int data;
    struct list_node *next; // pointer to next node in the list 
}node;

/* create new node */
node *getNewNode(int data) {
    node *new_node = new node;
    new_node->data = data;
    new_node->next = NULL;
    return new_node;
}

/* get size of list */
node* size(node *head)
{
    int len = 0;
    while (head != NULL)
    {
        len++;
        head = head->next;

    }
    return len;
}

/* displays the list elements */
void displayList(node *head) {
    cout << "Displaying List : ";
    while (head != NULL) {
        cout << head->data << " -> ";
        head = head->next;
    }
    cout << "NULL " << endl;
}

/* Search the node with element as data
Return the pointer to the node if found else return NULL */
node *searchNode(node *head, int data) {
    node *ptr = NULL;
    while (head) {
        if (head->data == data) {
            ptr = head;
            break;
        }
        head = head->next;
    }
    return ptr;
}

/* insert a node at the beginning of the list */
node *insertNodeBeg(node *head, int data) {
    node *ptr = getNewNode(data);
    if (head == NULL) { // if list is empty
        head = ptr;
    }
    else {
        ptr->next = head;
        head = ptr;
    }
    return head;
}

/* insert a node at the end of the list */
node *insertNodeEnd(node *head, int data) {
    node *ptr = getNewNode(data);
    if (head == NULL) { //if list is empty
        head = ptr;
    }
    else {
        node *temp = head;
        while (temp->next != NULL) { // move to the last node
            temp = temp->next;
        }
        temp->next = ptr; // insert node at the end
    }
    return head;
}

/* insert a node at the after a particular node in the list */
node *insertNodeAfter(node *head, int element, int data) {
    // search the element after which node is to be inserted
    node *temp = searchNode(head, element);
    if (temp == NULL) { // element not found
        cout << "Element not found ... " << endl;
    }
    else {
        node *ptr = getNewNode(data);
        if (temp->next == NULL) { // node has to inserted after the last node
            temp->next = ptr;
        }
        else {  // insert the node after the first or an intermediate node
            ptr->next = temp->next;
            temp->next = ptr;
        }
    }
    return head;
}

/* delete a particular node from the list */
node *deleteNode(node *head, int element) {
    node *temp = searchNode(head, element); // search the node to be deleted
    if (temp == NULL) { // element not found
        cout << "Node to be deleted not found ... " << endl;
    }
    else {
        if (temp == head) { // first node is to be deleted
            head = head->next;
            delete temp;
        }
        else { // node to deleted is an intermediate or last node
            node *ptr = head;
            while (ptr->next != temp) {
                ptr = ptr->next;
            }
            ptr->next = temp->next;
            delete temp;
        }
    }
    return head;
}

int main() 
{
    node *head = NULL;
    head = insertNodeBeg(head, 7);       // 7
    head = insertNodeBeg(head, 9);       // 9 -> 7
    head = insertNodeEnd(head, 11);      // 9 -> 7 -> 11
    head = insertNodeAfter(head, 9, 4);  // 9 -> 4 -> 7 -> 11
    head = insertNodeAfter(head, 7, 3);  // 9 -> 4 -> 7 -> 3 -> 11
    head = insertNodeAfter(head, 11, 6); // 9 -> 4 -> 7 -> 3 -> 11 -> 6
    head = size(head);// HERE i want to give size of LIST i,e 6 in this case !! 
    displayList(head);
    head = deleteNode(head, 7);          // 9 -> 4 -> 3 -> 11 -> 6
    head = deleteNode(head, 6);          // 9 -> 4 -> 3 -> 11
    head = deleteNode(head, 9);          // 4 -> 3 -> 11
    head = deleteNode(head, 3);         // 4 -> 11
    displayList(head);
    return 0;
}

[no name]

Хорошо..... разве вы не видите проблему с вашей сигнатурой функции, которая говорит, что она возвращает указатель на узел, а ваша функция фактически возвращает целое число?

2 Ответов

Рейтинг:
13

Jochen Arndt

Цитата:
возвращаемое значение не соответствует типу возвращаемого значения

это довольно ясно:
node* size(node *head)
{
    int len = 0;
    // ...
    return len;
}

Функция объявляется для возврата node* но ты возвращаешься len что int.

Вы, вероятно, хотите использовать:
int size(node *head)
{
    int len = 0;
    // ...
    return len;
}

int main()
{
    // ...
    int list_size = size(head);
    printf("size is %d\n", list_size);
    // ...
}


mayashah

Спасибо, это круто, но когда я делаю то же самое после head = deleteNode(head, 3);
это все еще дает мне 6 я хочу 2 сейчас здесь !! как же так !!

Jochen Arndt

Это требует некоторой отладки, чтобы выяснить. Или просто распечатайте список после каждой операции.

В данный момент я не вижу причины.

Еще одна проблема, с которой я столкнулся, заключается в том, что вы присваиваете возвращаемое значение deleteNode() head. Это установит head в NULL, когда узел не может быть найден. Но тогда вы получите 0, возвращенное из size ().

Это общая проблема вашего кода:
Вы отслеживаете заголовок списка во внешней переменной и должны передать его всем функциям и убедиться, что он действителен.

Лучшим решением было бы использовать класс, где head является защищенной переменной-членом. Это гарантирует, что head всегда действителен (при условии правильного кода), нет необходимости передавать его функциям, а возвращаемое значение может использоваться для указания успеха, неудачи или даже размера.

Рейтинг:
1

Patrice T

Первое, что нужно сделать, это проверить, что связанный список ведет себя так, как он должен вести себя, и только потом посмотреть, что с ним не так. size функция. Отладчик поможет вам все это проверить.

Вы должны научиться использовать отладчик как можно скорее. Вместо того, чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете, или увидеть, где он этого не делает.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.