重新排列链接列表元素

时间:2015-10-12 23:23:52

标签: c++

我是一名计算机科学专业的学生。我在数据结构方面苦苦挣扎。我试图完成一个项目:我必须创建一个函数,通过存储在字段中的双精度重新排列数组列表的元素。

有人可以看看这段代码并帮我一把吗?我失去了我的头发:

这是main.cpp

#include <iostream>
#include "node1.h"
#include <cstdlib>

using namespace main_savitch_5;
using namespace std;

node* merge_sorted_lists(const node* head_ptr1, const node* head_ptr2);
// precondition: lists pointed to by head_ptr1 & head_ptr2 are sorted in     increasing order
//                         & have distinct elements
// postcondition: returned pointer to a list which is sorted & contains     the elements in
//                            lists pointed to by head_ptr1 & head_ptr2     with duplicates removed

void display_list(const node* head_ptr);
// postcondition: elements in list pointed to by head_ptr have been displayed to standard output

    int main(int argc, char** argv)
    {
        node* head_ptr1 = NULL;
        list_head_insert(head_ptr1, 2.3);
        list_head_insert(head_ptr1, 16.2);
        list_head_insert(head_ptr1, 5.0);
        list_head_insert(head_ptr1, 2.3);

        node* head_ptr2 = NULL;
        list_head_insert (head_ptr2, 8);
        list_head_insert (head_ptr2, 6);
        list_head_insert (head_ptr2, 4.56);
        list_head_insert (head_ptr2, 1);
        //node* head_ptr = merge_sorted_lists(head_ptr1, head_ptr2);
        display_list(head_ptr1);


        node* head_ptr3 = list_sort(head_ptr1);

        display_list(head_ptr3);

        return 0;
    }

        void display_list(const node* head_ptr)
        {
        const node* current = head_ptr;
            while(current != NULL) 
            {
            cout << current->data() << endl;
            current = current->link();
        }
    }

    /*node* merge_sorted_lists(const node* head_ptr1, const node*     head_ptr2)
    {
        node* head_ptr = NULL;
        const node* current1 = head_ptr1;
        const node* current2 = head_ptr2;
        if(head_ptr1 == NULL) 
        {
            node* temp = NULL;
            list_copy(head_ptr2, head_ptr, temp);
        } 
        else if(head_ptr2 == NULL)
        {
            node* temp = NULL;
            list_copy(head_ptr1, head_ptr, temp);
        }
        else 
        {
            if(current1->data() < current2->data())
            {
                list_head_insert(head_ptr, current1->data());
                current1 = current1->link();
            } 
                else if(current1->data() > current2->data()) 
            {
                list_head_insert(head_ptr, current2->data());
                current2 = current2->link();
            } 
            else
            {
                list_head_insert(head_ptr, current1->data());
                current1 = current1->link();
                current2 = current2->link();
            }

            node* current = head_ptr;
            while(current1 != NULL && current2 != NULL) 
            {
                if(current1->data() < current2->data()) 
                {
                    list_insert(current, current1->data());
                    current1 = current1->link();
                } 
                else if(current1->data() > current2->data())
                {
                    list_insert(current, current2->data());
                    current2 = current2->link();
                } 
                else 
                {
                    list_insert(current, current1->data());
                    current1 = current1->link();
                    current2 = current2->link();
                }
                current = current->link();
            }
            if(current1 != NULL) 
            {
                node* temp = NULL;
                node* ptr = NULL;
                list_copy(current1, ptr, temp);
                current->set_link(ptr);
            } 
            else 
            {
                node* temp = NULL;
                node* ptr = NULL;
                list_copy(current2, ptr, temp);
                current->set_link(ptr);
            }
        }
        return head_ptr;
    }*/

这是我的node1.h文件

        // FILE: node1.h
    // PROVIDES: A class for a node in a linked list, and list manipulation
    // functions, all within the namespace main_savitch_5
    //
    // TYPEDEF for the node class:
    //     Each node of the list contains a piece of data and a pointer to the
    //     next node. The type of the data is defined as node::value_type in a
    //     typedef statement. The value_type may be any
    //     of the built-in C++ classes (int, char, ...) or a class with a copy
    //     constructor, an assignment operator, and a test for equality (x == y).
    //
    // CONSTRUCTOR for the node class:
    //   node(
    //     const value_type& init_data = value_type(),
    //     node* init_link = NULL
    //   )
    //     Postcondition: The node contains the specified data and link.
    //     NOTE: The default value for the init_data is obtained from the default
    //     constructor of the value_type. In the ANSI/ISO standard, this notation
    //     is also allowed for the built-in types, providing a default value of
    //     zero. The init_link has a default value of NULL.
    //
    // NOTE:
    //   Some of the functions have a return value which is a pointer to a node.
    //   Each of these  functions comes in two versions: a non-const version (where
    //   the return value is node*) and a const version (where the return value
    //   is const node*). 
    // EXAMPLES:
    //    const node *c;
    //    c->link( ) activates the const version of link
    //    list_search(c,... calls the const version of list_search
    //    node *p;
    //    p->link( ) activates the non-const version of link
    //    list_search(p,... calls the non-const version of list_search
    //
    // MEMBER FUNCTIONS for the node class:
    //   void set_data(const value_type& new_data)
    //     Postcondition: The node now contains the specified new data.
    //   
    //   void set_link(node* new_link)
    //     Postcondition: The node now contains the specified new link.
    //
    //   value_type data( ) const
    //     Postcondition: The return value is the data from this node.
    //
    //   const node* link( ) const <----- const version
    //   node* link( ) <----------------- non-const version
    //   See the note (above) about the const version and non-const versions:
    //     Postcondition: The return value is the link from this node.
    //   
    // FUNCTIONS in the linked list toolkit:
    //   size_t list_length(const node* head_ptr)
    //     Precondition: head_ptr is the head pointer of a linked list.
    //     Postcondition: The value returned is the number of nodes in the linked
    //     list.
    //
    //   void list_head_insert(node*& head_ptr, const node::value_type& entry) 
    //     Precondition: head_ptr is the head pointer of a linked list.
    //     Postcondition: A new node containing the given entry has been added at
    //     the head of the linked list; head_ptr now points to the head of the new,
    //     longer linked list.
    //
    //   void list_insert(node* previous_ptr, const node::value_type& entry) 
    //     Precondition: previous_ptr points to a node in a linked list.
    //     Postcondition: A new node containing the given entry has been added
    //     after the node that previous_ptr points to.
    //
    //   const node* list_search(const node* head_ptr, const node::value_type& target) 
    //   node* list_search(node* head_ptr, const node::value_type& target) 
    //   See the note (above) about the const version and non-const versions:
    //     Precondition: head_ptr is the head pointer of a linked list.
    //     Postcondition: The pointer returned points to the first node containing
    //     the specified target in its data member. If there is no such node, the
    //     null pointer is returned.
    //
    //   const node* list_locate(const node* head_ptr, size_t position) 
    //   node* list_locate(node* head_ptr, size_t position) 
    //   See the note (above) about the const version and non-const versions:
    //     Precondition: head_ptr is the head pointer of a linked list, and
    //     position > 0.
    //     Postcondition: The pointer returned points to the node at the specified
    //     position in the list. (The head node is position 1, the next node is
    //     position 2, and so on). If there is no such position, then the null
    //     pointer is returned.
    //
    //   void list_head_remove(node*& head_ptr) 
    //     Precondition: head_ptr is the head pointer of a linked list, with at
    //     least one node.
    //     Postcondition: The head node has been removed and returned to the heap;
    //     head_ptr is now the head pointer of the new, shorter linked list.
    //
    //   void list_remove(node* previous_ptr) 
    //     Precondition: previous_ptr points to a node in a linked list, and this
    //     is not the tail node of the list.
    //     Postcondition: The node after previous_ptr has been removed from the
    //     linked list.
    //
    //   void list_clear(node*& head_ptr) 
    //     Precondition: head_ptr is the head pointer of a linked list.
    //     Postcondition: All nodes of the list have been returned to the heap,
    //     and the head_ptr is now NULL.
    //
    //   void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr) 
    //     Precondition: source_ptr is the head pointer of a linked list.
    //     Postcondition: head_ptr and tail_ptr are the head and tail pointers for
    //     a new list that contains the same items as the list pointed to by
    //     source_ptr. The original list is unaltered.
    //  void list_piece(
    //    const node* start_ptr, const node* end_ptr, 
    //    node*& head_ptr, node*& tail_ptr
    //  )
    //    Precondition: start_ptr and end_ptr are pointers to nodes on the same
    //    linked list, with the start_ptr node at or before the end_ptr node
    //    Postcondition: head_ptr and tail_ptr are the head and tail pointers for a
    //    new list that contains the items from start_ptr up to but not including 
    //    end_ptr.  The end_ptr may also be NULL, in which case the new list 
    //    contains elements from start_ptr to the end of the list.
    //
    // DYNAMIC MEMORY usage by the toolkit: 
    //   If there is insufficient dynamic memory, then the following functions throw
    //   bad_alloc: the constructor, list_head_insert, list_insert, list_copy,
    //   list_piece.

    #ifndef MAIN_SAVITCH_NODE1_H  
    #define MAIN_SAVITCH_NODE1_H
    #include <cstdlib> // Provides size_t and NULL

    namespace main_savitch_5
    {
        class node
        {
        public:
        // TYPEDEF
        typedef double value_type;

        // CONSTRUCTOR
        node(
            const value_type& init_data = value_type( ),
            node* init_link = NULL
        )
        { data_field = init_data; link_field = init_link; }

        // Member functions to set the data and link fields:
            void set_data(const value_type& new_data) { data_field = new_data; }
            void set_link(node* new_link)             { link_field = new_link; }

        // Constant member function to retrieve the current data:
        value_type data( ) const { return data_field; }

        // Two slightly different member functions to retreive
        // the current link:

        const node* link( ) const { return link_field; }
            node* link( )             { return link_field; }


        private:
        value_type data_field;
        node* link_field;
        };

        // FUNCTIONS for the linked list toolkit

        void list_head_insert(node*& head_ptr, const node::value_type& entry); 
        /*
        void list_insert(node* previous_ptr, const node::value_type& entry);  
        std::size_t list_length(const node* head_ptr);
        node* list_search(node* head_ptr, const node::value_type& target);
        const node* list_search
        (const node* head_ptr, const node::value_type& target);
        node* list_locate(node* head_ptr, std::size_t position);
        const node* list_locate(const node* head_ptr, std::size_t position);
        void list_head_remove(node*& head_ptr);
        void list_remove(node* previous_ptr);
        void list_clear(node*& head_ptr);
        void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr);
        */


        // sort function
        node* list_sort(node* ptr1);
    }

    #endif

这是我的node1.cpp

    // FILE: node1.cxx
    // IMPLEMENTS: The functions of the node class and the
    // linked list toolkit (see node1.h for documentation).
    // INVARIANT for the node class:
    //   The data of a node is stored in data_field, and the link in link_field.

    #include <algorithm>
    #include <iostream>
    #include "node1.h"
    #include <cassert>    // Provides assert
    #include <cstdlib>    // Provides NULL and size_t
    using namespace std;

    namespace main_savitch_5
    {
      /*  size_t list_length(const node* head_ptr)
        // Library facilities used: cstdlib
        {
        const node *cursor;
        size_t answer;

        answer = 0;
        for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
            ++answer;

        return answer;
        } */

        void list_head_insert(node*& head_ptr, const node::value_type& entry)
        {
        head_ptr = new node(entry, head_ptr);
        }

       /* void list_insert(node* previous_ptr, const node::value_type& entry)
         {
        node *insert_ptr;

        insert_ptr = new node(entry, previous_ptr->link( ));
        previous_ptr->set_link(insert_ptr);
        }*/

       /* node* list_search(node* head_ptr, const node::value_type& target)
         // Library facilities used: cstdlib
        {
        node *cursor;

        for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
            if (target == cursor->data( ))
            return cursor;
        return NULL;
         } */

         /*const node* list_search(const node* head_ptr, const node::value_type& target)
        // Library facilities used: cstdlib
        {
        const node *cursor;

        for (cursor = head_ptr; cursor != NULL; cursor = cursor->link( ))
            if (target == cursor->data( ))
            return cursor;
        return NULL;
        }*/

        /*node* list_locate(node* head_ptr, size_t position)
        // Library facilities used: cassert, cstdlib
        {
        node *cursor;
        size_t i;

        assert (0 < position);
        cursor = head_ptr;
        for (i = 1; (i < position) && (cursor != NULL); i++)
            cursor = cursor->link( );
        return cursor;
        }*/

        /*const node* list_locate(const node* head_ptr, size_t position)
        // Library facilities used: cassert, cstdlib
        {
        const node *cursor;
        size_t i;

        assert (0 < position);
        cursor = head_ptr;
        for (i = 1; (i < position) && (cursor != NULL); i++)
            cursor = cursor->link( );
        return cursor;
        }

        void list_head_remove(node*& head_ptr)
        {
        node *remove_ptr;

        remove_ptr = head_ptr;
        head_ptr = head_ptr->link( );
        delete remove_ptr;
        }

        void list_remove(node* previous_ptr)
        {
        node *remove_ptr;

        remove_ptr = previous_ptr->link( );
        previous_ptr->set_link( remove_ptr->link( ) );
        delete remove_ptr;
        }

        void list_clear(node*& head_ptr)
        // Library facilities used: cstdlib
        {
        while (head_ptr != NULL)
            list_head_remove(head_ptr);
        }

        void list_copy(const node* source_ptr, node*& head_ptr, node*& tail_ptr)
        // Library facilities used: cstdlib
        {
        head_ptr = NULL;
        tail_ptr = NULL;

        // Handle the case of the empty list.
        if (source_ptr == NULL)
            return;

        // Make the head node for the newly created list, and put data in it.
        list_head_insert(head_ptr, source_ptr->data( ));
        tail_ptr = head_ptr;

         // Copy the rest of the nodes one at a time, adding at the tail of new list.
        source_ptr = source_ptr->link( );
        while (source_ptr != NULL)
        {
            list_insert(tail_ptr, source_ptr->data( ));
            tail_ptr = tail_ptr->link( );
            source_ptr = source_ptr->link( );
        }

     }*/

     node* list_sort(node* ptr1)
     {
         int g = 0;
         int i = 0;
         double sorted_array[4];
         node* sorted = NULL;
         const node* current = ptr1;
         const node* current2 = ptr1;

         while(current != NULL)
         {
            sorted_array[i] = current->data();
            current = current->link();
            i++;
         }

         sort(sorted_array, sorted_array + 4);

         while(current2 != NULL)
         {

            for(int g = 0; g < 5; g++)
            {
                if(sorted_array[g] == current2->data())
                {
                    (*current2). 
                }
            }
         }


       return sorted;
      }

    }

无论什么帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

void insert(node * & list_head, int new_data)
{
  if (list_head == NULL)
  {
    list_head = new node(data);
  }
  else
  {
    node * prev = list_head;
    node * current = list_head;
    while ((current != NULL) && (current->data < data))
    {
      prev = current;
      current = current->next;
    }
    node * n = new node(data);
    n->next = prev->next;
    prev->next = n;
  }
}

从根本上说,您查看每个节点并比较数据字段。如果节点的数据小于给定的数据,则继续扫描。

当节点数据项大于或等于时,将带有新数据的新节点插入列表。

这称为链接列表的插入排序。