1476 – FSortare

De la Universitas MediaWiki

Enunţ

Se consideră o listă liniară simplu înlănțuită, alocată dinamic, în care elementele sunt de tipul declarat mai jos:

  struct nod{
    int info;
    nod *urm;
  };

în care câmpul info memorează un număr întreg, iar câmpul urm memorează adresa următorului element al listei.

Cerința

Să se scrie o funcție C++ cu următorul prototip:

 void sortareCrescator(nod *&prim)

care sortează crescător elementele listei al cărei prim element are adresa memorată în prim.

Restricții și precizări

  • numele funcției va fi sortareCrescator
  • lista va conține cel puțin 3 elemente
  • rezolvarea se va face in python

Exemplu

Dacă lista este formată din valorile (5, 3, 9, 4, 2, 12), după apelul funcţiei ea va conţine elementele (2, 3, 4, 5, 9, 12).

Rezolvare

#1476 FSortare
class Node:
    def __init__(self, info):
        self.info = info
        self.next = None

def create_linked_list(values):
    head = None
    tail = None
    for value in values:
        new_node = Node(value)
        if head is None:
            head = new_node
            tail = new_node
        else:
            tail.next = new_node
            tail = new_node
    return head

def sortareCrescator(prim):
    # Funcție pentru inserarea unui nod într-o listă sortată
    def insert_sorted(head, new_node):
        if head is None or head.info >= new_node.info:
            new_node.next = head
            return new_node

        current = head
        while current.next is not None and current.next.info < new_node.info:
            current = current.next
        
        new_node.next = current.next
        current.next = new_node
        return head
    
    # Inițializăm lista sortată ca fiind lista vidă
    sorted_list = None
    current = prim
    
    # Parcurgem lista inițială și inserăm fiecare nod în lista sortată
    while current is not None:
        sorted_list = insert_sorted(sorted_list, Node(current.info))
        current = current.next
    
    # Copiem lista sortată înapoi în lista inițială
    current = prim
    sorted_current = sorted_list
    while sorted_current is not None:
        current.info = sorted_current.info
        current = current.next
        sorted_current = sorted_current.next

# Testăm funcția
def print_list(head):
    current = head
    while current is not None:
        print(current.info, end=" ")
        current = current.next
    print()

# Cream lista de test folosind funcția create_linked_list
values = [5, 3, 9, 4, 2, 12]
l = create_linked_list(values)

print("Lista initiala:")
print_list(l)

# Sortam lista
sortareCrescator(l)

print("Lista sortata:")
print_list(l)