Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 514817

Расшифруйте пример по связному списку - C для начинающих

$
0
0
:

#include <stdio.h>
#include <stdlib.h>

struct listNode {
        char data;
        struct listNode *nextPtr;
};

typedef struct listNode LISTNODE;
typedef LISTNODE *LISTNODEPTR;

void insert (LISTNODEPTR *, char);
char delete (LISTNODEPTR *, char);
int isEmptry (LISTNODEPTR);
void printList (LISTNODEPTR);
void instructions (void);

int main()
{
        LISTNODEPTR startPtr = NULL;
        int choice;
        char item;

        instructions ();
        printf("? ");
        scanf ("%d", &choice);

        while (choice != 3) {

                switch (choice) {
                        case 1:
                        printf ("Enter a character: ");
                        scanf ("\n%c", &item);
                        insert (&startPtr, item);
                        printList (startPtr);
                        break;
                        case 2:
                        if (!isEmptry(startPtr)) {
                                printf ("Enter character to be deleted: ");
                                scanf ("\n%c", &item);

                                if (delete (&startPtr, item)) {
                                        printf ("%c deleted.\n", item);
                                        printList (startPtr);
                                }
                                else
                                        printf ("%c not found.\n\n", item);
                        }
                        else
                                printf ("List is empty.\n\n");

                        break;
                        default:
                        printf ("Invalid choice.\n\n");
                        instructions ();
                        break;
                }
                printf ("? ");
                scanf ("%d", &choice);
        }
        printf ("End of run.\n");
        return 0;
}

void instructions (void)
{       
        printf ("Enter your choice: \n"
                "1 to insert an element into the list.\n"
                "2 to delete an element from the list.\n"
                "3 to end.\n");
}

/* Вставка нового значения в упорядоченный список */
void insert (LISTNODEPTR *sPtr, char value)
{                       
        LISTNODEPTR newPtr, previousPtr, currentPtr;

        newPtr = malloc (sizeof(LISTNODE));

        if (newPtr != NULL) {
        newPtr->data = value;
        newPtr->nextPtr = NULL;

        previousPtr = NULL;
        currentPtr = *sPtr;

        while (currentPtr != NULL && value > currentPtr->data) {
                previousPtr = currentPtr;
                currentPtr = currentPtr->nextPtr;
        }               

        if (previousPtr == NULL) {
                newPtr->nextPtr = *sPtr;
                *sPtr = newPtr;
        }
        else {
                previousPtr->nextPtr = newPtr;
                newPtr->nextPtr = currentPtr;
        }
}
else
        printf ("%c not inserted. No memory available.\n", value);
}

/* Удаление элемента списка */
char delete (LISTNODEPTR *sPtr, char value)
{
        LISTNODEPTR previousPtr, currentPtr, tempPtr;

        if (value == (*sPtr)->data) {
                tempPtr = *sPtr;
                *sPtr = (*sPtr)->nextPtr;
                free (tempPtr);
                return value;
        }
        else {
                previousPtr = *sPtr;
                currentPtr = (*sPtr)->nextPtr;

                while (currentPtr != NULL && currentPtr->data != value) {
                        previousPtr = currentPtr;
                        currentPtr = currentPtr->nextPtr;
                }
                if (currentPtr != NULL) {
                        tempPtr = currentPtr;
                        previousPtr->nextPtr = currentPtr->nextPtr;
                        free (tempPtr);
                        return value;
                }
        }
        return '\0';
}

/* Возвратить 1, ели список пуст в противном случае 0 */
int isEmptry (LISTNODEPTR sPtr)
{
        return sPtr == NULL;
}

void printList (LISTNODEPTR currentPtr)
{
        if (currentPtr == NULL)
                printf ("List is empty. \n\n");
        else {
                printf ("The list is: \n");

                while (currentPtr != NULL) {
                        printf ("%c--> ", currentPtr->data);
                        currentPtr = currentPtr->nextPtr;
                }
                printf ("NULL\n\n");
        }
}

Вот такой первый пример по связным спискам у Дейтла.
Возникло множество вопросов, сложно разобраться самому, может кто подскажет.
1.
:

struct listNode {
        char data;
        struct listNode *nextPtr;
};

typedef struct listNode LISTNODE;
typedef LISTNODE *LISTNODEPTR;

Сначала создается тип данных struct listNode, после чего его переименовывают в LISTNODE, а тот в свою очередь переименовывают в указатель *LISTNODEPTR. Правильно я понимаю? Если да, то для чего это сделано?
2. Почему в портатипах функций insert и delete передается LISTNONODEPTR со зведочкой, а в функции isEmptry и printList без звездочки?
3.
:

if (!isEmptry(startPtr))
Не понятна вотэта вот строка.
Если кто дочитал, то уже огромное спасибо)

Viewing all articles
Browse latest Browse all 514817

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>