8.1.4 Пример программы обработки списка
Программа взята из книги Дейтела "Программирование на языке С".
Программа демонстрирует управление списком символов. Программа обеспечивает
следующие возможности:
- вставка символа в список в алфавитном порядке (функция insert);
- удаление символа из списка (функция delete);
- вывод списка на экран;
- выбор действия пользователя посредством меню.
Текст программы обработки списка.
#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. |