Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //list with different functional
- //link https://yadi.sk/d/_1r4N-gZbXsTpA
- /*
- ТЕЛЕФОННАЯ КНИЖКА С ИСПОЛЬЗОВАНИЕМ ЛИНЕЙНОГО СПИСКА.
- При помощи линейных списков реализовать приложение,
- позволяющее поддерживать список контактов, содержащих
- - номер телефона (число),
- - имя абонента (строка текста до 128 символов) и
- - дополнительные данные (строка текста до 256 символов).
- Данные книжки записаны в файле,
- при запуске приложения загружаются в память
- в виде линейного списка,
- при закрытии приложения записываются в файл,
- если были сделаны изменения
- в данных.+
- Со списком необходимо иметь возможность выполнять следующие операции:
- - добавить контакт, +
- - ввести значения полей, обязательными являются
- номер телефона и имя абонента: +
- - удалить контакт; +
- - удалить все записи; +
- *
- - поиск контакта по имени абонента, использовать алгоритм soundex; +
- - поиск +
- контакта по номеру, можно задавать только последние цифры номера;
- - вывод для найденных контактов всей информации, включая дополнительные данные; +
- -
- сортировка списка по имени абонента ---
- - сортировка по номеру телефона. ---
- Дополнительные сведения:
- typedef cont {
- long int num;
- char name[128];
- char extra[256];
- CONTACT;
- Использовать алгоритм soundex (или аналогичный по назначению алгоритм),
- переработка из оригинального (английский) в русский
- вариант.
- Поиск последовательным просмотром списка
- Проверка введенной информации на корректность (длина строки)
- Выделение гласных и согласных для soundex
- Функции
- сравнения имени абонента, номера телефона (в т.ч. по части номера)
- Функции-макросы isupper, ispunct, isspace, etc
- */
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Node{
- long int num;
- char name[128];
- char extra[256];
- struct Node *next;
- } Node;
- void push(Node **head, long int data, char c[128], char e[256] ){ //добавление первого элемента
- Node *tmp = (Node*)malloc(sizeof(Node));
- tmp->num=data;
- strcpy(tmp->name,c);
- strcpy(tmp->extra,e);
- tmp->next=(*head);
- (*head)=tmp;
- }
- int pop(Node **head) { //удаление первого элемента в списке и возвращение указателя и значения
- Node* prev = NULL;
- int val;
- if (!(head == NULL))
- prev = (*head);
- val = prev->num;
- (*head) = (*head)->next;
- free(prev);
- return val;
- }
- void pushBack(Node *head, long int value, char c[128], char e[256]){ //добавление нового элемента в конец сп
- Node *last = head;
- while (last->next){
- last=last->next;
- }
- Node *tmp = (Node*)malloc(sizeof(Node));
- tmp->num=value;
- strcpy(tmp->name,c);
- strcpy(tmp->extra,e);
- tmp->next=NULL;
- last->next=tmp;
- }
- int deleteNth(Node **head, int n) { //уд
- n--;
- int counter;
- if (n == 0) {
- return pop(head);
- } else {
- Node *prev = *head;
- while (counter < n-1 && head){
- prev = prev->next;
- counter++;
- }
- Node *elm = prev->next;
- int val = elm->num;
- prev->next = elm->next;
- free(elm);
- return val;
- }
- }
- void printLinkedList(const Node *head) {
- while (head) {
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s\n__________________________________\n\n", head->num,head->name,head->extra);
- head=head->next;
- }
- printf("\n");
- }
- void deleteList(Node **head) {
- Node* prev = NULL;
- while ((*head)->next) {
- prev = (*head);
- (*head) = (*head)->next;
- free(prev);
- }
- (*head)=(*head)->next;
- head=NULL;
- }
- void soundex(Node *head, char c[128]) {
- char h1[4],h2[4];
- int i,k,j;
- for (i=0;i<4;i++)
- {
- h1[i]=0;
- h2[i]=0;
- }
- if ((c[0]<91) && (c[0]>64))
- h1[0]=c[0];
- else
- if ((c[0]<123) && (c[0]>96))
- h1[0]=c[0]-32;
- k=1;
- for (i=1;i<128;i++)
- {
- if (k<4){
- if ((c[i]==98 || c[i]==102 || c[i]==112 || c[i]==118) || (c[i]==98-32 || c[i]==102-32 || c[i]==112-32 || c[i]==118-32))
- if (h1[k-1]!=1)
- {
- h1[k]=1;
- k++;
- }
- if ((c[i]==99 || c[i]==103 || c[i]==106 || c[i]==107 || c[i]==113 || c[i]==115 || c[i]==120 || c[i]==122) || (c[i]==99-32 || c[i]==103-32 || c[i]==106-32 || c[i]==107-32 || c[i]==113-32 || c[i]==115-32 || c[i]==120-32 || c[i]==122-32))
- if (h1[k-1]!=2)
- {
- h1[k]=2;
- k++;
- }
- if ((c[i]==100 || c[i]==116) || (c[i]==100-32 || c[i]==116-32))
- if (h1[k-1]!=3)
- {
- h1[k]=3;
- k++;
- }
- if ((c[i]==108) || (c[i]==108-32))
- if (h1[k-1]!=4)
- {
- h1[k]=4;
- k++;
- }
- if ((c[i]==109 || c[i]==110) || (c[i]==109-32 || c[i]==110-32))
- if (h1[k-1]!=5)
- {
- h1[k]=5;
- k++;
- }
- if ((c[i]==114) || (c[i]==114-32))
- if (h1[k-1]!=6)
- {
- h1[k]=6;
- k++;
- }
- }
- for (j=k;j>k;j--)
- h1[j]=0;
- }
- while (head!=NULL)
- {
- k=1;
- for (i=1;i<128;i++)
- {
- if ((head->name[0]<91) && (head->name[0]>64))
- h2[0]=head->name[0];
- else
- if ((head->name[0]<123) && (head->name[0]>96))
- h2[0]=head->name[0]-32;
- if (k<4){
- if ((head->name[i]==98 || head->name[i]==102 || head->name[i]==112 || head->name[i]==118) || (head->name[i]==98-32 || head->name[i]==102-32 || head->name[i]==112-32 || head->name[i]==118-32))
- if (h2[k-1]!=1)
- {
- h2[k]=1;
- k++;
- }
- if ((head->name[i]==99 || head->name[i]==103 || head->name[i]==106 || head->name[i]==107 || head->name[i]==113 || head->name[i]==115 || head->name[i]==120 || head->name[i]==122) || (head->name[i]==99-32 || head->name[i]==103-32 || head->name[i]==106-32 || head->name[i]==107-32 || head->name[i]==113-32 || head->name[i]==115-32 || head->name[i]==120-32 || head->name[i]==122-32))
- {
- if (h2[k-1]!=2)
- {
- h2[k]=2;
- k++;
- }
- }
- if ((head->name[i]==100 || head->name[i]==116) || (head->name[i]==100-32 || head->name[i]==116-32))
- {
- if (h2[k-1]!=3)
- {
- h2[k]=3;
- k++;
- }
- }
- if ((head->name[i]==108) || (head->name[i]==108-32))
- {
- if (h2[k-1]!=4)
- {
- h2[k]=4;
- k++;
- }
- }
- if ((head->name[i]==109 || head->name[i]==110) || (head->name[i]==109-32 || head->name[i]==110-32))
- {
- if (h2[k-1]!=5)
- {
- h2[k]=5;
- k++;
- }
- }
- if ((head->name[i]==114) || (head->name[i]==114-32))
- {
- if (h2[k-1]!=6)
- {
- h2[k]=6;
- k++;
- }
- }
- }
- }
- if ((h1[0]==h2[0]) && (h1[1]==h2[1]) && (h1[2]==h2[2]) && (h1[3]==h2[3]))
- {
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- }
- head=head->next;
- h2[0]=0;
- h2[1]=0;
- h2[2]=0;
- h2[3]=0;
- }
- }
- void num(Node *head,long int n){
- while (head!=NULL)
- {
- if (head->num==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- else
- if (head->num%10==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- else
- if (head->num%100==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- else
- if (head->num%1000==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- else
- if (head->num%10000==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- else
- if (head->num%100000==n)
- printf("\n__________________________________\nPeople data:\n\nPhone number : %ld\nName : %s\nExtra : %s \n__________________________________\n", head->num,head->name,head->extra);
- head=head->next;
- }
- }
- void filein(Node *head)
- {
- FILE *file;
- file = fopen("list.txt","w");
- while (head!=NULL)
- {
- fprintf(file,"%ld;%s;%s;\n",head->num, head->name, head->extra);
- head=head->next;
- }
- fclose(file);
- }
- void bubble_sort_phone(Node *head) {
- Node *p = NULL;
- char c[128],e[256];
- if (head != NULL) {
- while (head->next != NULL) {
- p = head->next;
- do {
- if (p->num < head->num) {
- int tmp = p->num;
- strcpy(c,p->name);
- strcpy(e,p->extra);
- p->num = head->num;
- strcpy(p->name,head->name);
- strcpy(p->extra,head->extra);
- head->num = tmp;
- strcpy(head->name,c);
- strcpy(head->extra,e);
- }
- p = p->next;
- } while (p != NULL);
- head = head->next;
- }
- }
- }
- void bubble_sort_name(Node *head) {
- Node *p = NULL;
- char c[128],e[256];
- if (head != NULL) {
- while (head->next != NULL) {
- p = head->next;
- do {
- if (strcmp(p->name,head->name)<0) {
- int tmp = p->num;
- strcpy(c,p->name);
- strcpy(e,p->extra);
- p->num = head->num;
- strcpy(p->name,head->name);
- strcpy(p->extra,head->extra);
- head->num = tmp;
- strcpy(head->name,c);
- strcpy(head->extra,e);
- }
- p = p->next;
- } while (p != NULL);
- head = head->next;
- }
- }
- }
- int main()
- {
- Node *head = NULL;
- int y,i,n,k,x;
- i=0;
- FILE *file;
- file = fopen("list.txt","r");
- long int ix;
- int j;
- j=0;
- char s1[512];
- char * pch;
- char * pch2;
- while (fgets(s1,300,file))
- {
- j++;
- ix=atoi(s1);
- pch = strtok(s1,";");
- pch = strtok(NULL, ";");
- pch2=pch;
- pch = strtok(NULL, ";");
- if (j==1)
- {
- i++;
- push(&head,ix,pch2,pch);
- }
- else
- pushBack(head,ix,pch2,pch);
- }
- fclose(file);
- char c[128],e[256];
- x=0;
- c[1]=0;
- while (y!=9)
- {
- printf("\n1 - Add contact \n2 - delete a contact \n3 - delete all entries \n4 - search for a contact by name \n5 - search for a contact by number \n6 - the withdrawal of all the contacts and information \n7 - sorted by phone number\n8 - sorted by name\n9 - Exit and save list\n\n");
- scanf("%i",&y);
- if (y==1)//добавление
- { //можно переделать
- while ((x==0)||(x<0)||(c[1]==0))
- {
- printf("Phone number & Name are required\n\nPhone number : ");
- scanf("%i",&x);
- printf("Name : ");
- scanf("%s",c);
- printf("Extra : ");
- scanf("%s",e);
- }
- if (i==0)
- push(&head,x,c,e);
- else
- {
- pushBack(head,x,c,e);
- }
- if (i==0)
- i++;
- x=0;
- c[1]=0;
- }
- else
- if (y==2)//удаление
- {
- printf("Enter list item index\n");
- scanf("%d",&n);
- if ((n==1) && (head->next==NULL))
- i=0;
- deleteNth(&head,n);
- }
- else
- if (y==3)
- {
- deleteList(&head);
- i=0;
- }
- else
- if (y==4)
- {
- for (k=0;k<128;k++)
- c[k]=0;
- printf("Enter name\n");
- scanf("%s",c);
- soundex(head,c);
- }
- else
- if (y==5)
- {
- printf("Enter phone number\n");
- scanf("%i", &x);
- num(head,x);
- }
- else
- if (y==6)
- {
- printLinkedList(head);
- }
- else
- if(y==7)
- {
- bubble_sort_phone(head);
- printf("List is sorted\n");
- }
- else
- if(y==8)
- {
- bubble_sort_name(head);
- printf("List is sorted\n");
- }
- }
- //Удаляем пятый элемент (индексация с нуля)
- filein(head);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement