Urok8

8.1.4 Пример программы обработки списка

Программа взята из книги Дейтела "Программирование на языке С".
Программа демонстрирует управление списком символов. Программа обеспечивает
следующие возможности:

  1. вставка символа в список в алфавитном порядке (функция insert);
  2. удаление символа из списка (функция delete);
  3. вывод списка на экран;
  4. выбор действия пользователя посредством меню.

Текст программы обработки списка.

#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 deleteChar(LISTNODEPTR *, char); //функция удаления символа из списока
int  isEmpty(LISTNODEPTR);	      //функция проверки пуст ли список
void printList(LISTNODEPTR);	      //функция печати списка
void instructions(void);	      //функция вывода пунктов меню
 
main()
{
    LISTNODEPTR startPtr = NULL;
    int choice; //выбранный пункт меню
    char item;  //введенный символ
 
    instructions(); //вывод меню
    printf("? ");   //приглашение к вводу
    scanf("%d",&choice);
 
    while (choice != 3){
        switch(choice){
            case 1: //заполнение списка символами
                printf("Enter a caracter: ");
                scanf("\n%c",&item);
                insert(&startPtr, item);
                printList(startPtr);
                break;
            case 2: //удаление символа из списка
                if (!isEmpty(startPtr)){
                    printf("Enter a caracter to be deleted: ");
                    scanf("\n%c",&item);
 
                    if (deleteChar(&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;
}//End of main()
 
    void instructions(void)
    {   //функция вывода пунктов меню
        printf("Enter your choice:\n"
               "1 to insert an element into this list.\n"
               "2 to delete an element from this list.\n"
               "3 to the end.\n");
    }
 
    void insert(LISTNODEPTR *sPtr, char value)
    {   //функция вставки символа в упорядоченный список
        //sPtr -  адрес переменной, указывающей на начало списка
        //value - вставляемый символ
        LISTNODEPTR newPtr, previousPtr, currentPtr;
 
        newPtr=(LISTNODEPTR )malloc(sizeof(LISTNODE));
        //newPtr = new LISTNODE;   //variant C++
 
        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 avaible. \n", value);
    }//End of instructions()
 
    char deleteChar(LISTNODEPTR *sPtr, char value)
    {   //функция удаления элемента списка
        //sPtr -  адрес переменной, указывающей на начало списка
        //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';
    }//End of deleteChar()
 
    int isEmpty(LISTNODEPTR sPtr)
    {   //функция определяет пуст ли список
        //sPtr - перемення, указывающая на начало списка
        //возращает 1, если список пуст, в противном случае - 0
 
        return sPtr == NULL;
    }
 
    void printList(LISTNODEPTR currentPtr)
    {   //функция печати списка
        //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");
        }
}//End of printList()
 
//Результат работы программы:
 
Enter your choice:
1 to insert an element into this list.
2 to delete an element from this list.
3 to the end.
? Enter a caracter: a The list is:
a->NULL
 
? Enter a caracter: b The list is:
a->b->NULL
 
? Enter a caracter: c The list is:
a->b->c->NULL
 
? Enter a caracter: f The list is:
a->b->c->f->NULL
 
? Enter a caracter: g The list is:
a->b->c->f->g->NULL
 
? Enter a caracter to be deleted: a deleted.
The list is:
b->c->f->g->NULL
 
? Enter a caracter to be deleted: c deleted.
The list is:
b->f->g->NULL
 
? End of run.


 

Урок 8.4. Собственные имена типов

Читать далее

Урок 8.2. Битовые поля

Читать далее

Урок 8.3. Смеси

Читать далее

Урок 8.1.3. Указатели и структуры

Читать далее

Translate Переводчик

Подписка на новости

SmartResponder.ru
Ваш e-mail: *
Ваше имя: *

Хостинг для Wordpress сайтов