Поиск элемента односвязного списка по значению поля (я в отчаянии.) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Сделал односвязный список и множество функций для него. Сама структура в виде: ФИО, должность, место проживания. Однако не могу сделать поиск элемента односвязного списка по имени - в "главном меню" 6 пункт, функция searchInList() на 103 строке. Создаю небольшой список из 3-4 элементов, пробую добавить после какого нибудь элемента - не работает, ибо функция searchInList() все время возвращает NULL. Прилагаю весь код, код относительно объёмный. Прошу помощи
#include 
#include 
#include 
#include 
#include 
 
struct Node {
    char snp[256];
    char pos[256];
    char place[256];
    struct Node *next;
};
 
typedef struct Node *PNode;
 
PNode Head = NULL;
 
PNode fAddNode(const char* snp, const char* pos, const char* place)
{
    PNode NewNode = (PNode)malloc(sizeof(struct Node));
    strcpy(NewNode->snp, snp);
    strcpy(NewNode->pos, pos);
    strcpy(NewNode->place, place);
    NewNode->next = Head == NULL ? NewNode : Head->next;
    if (Head) Head->next = NewNode;
    Head = NewNode;
}
 
PNode getNum(int n) {
    int count = 1;
    PNode head = Head;
    PNode _Head = Head;
    if(n != 1)
    do
    {
        count++;
        _Head = _Head->next;
    } while(count < n && _Head != head);
    return _Head;
}
 
PNode getLast() {
    PNode head = Head;
    do
    {
        head = head->next;
    } while(head->next != Head);
    return head;
}
 
int nNode()
{
    if(Head == NULL)
    {
        return 0;
    }
    int n = 0;
    PNode head = Head;
    do
    {
        n++;
        Head = Head->next;
    } while(Head != head);
    return(n);
}
 
PNode AddNode(const char* snp, const char* pos, const char* place, int n)
{
    int num = nNode(Head);
    if(Head == NULL)
    {
        fAddNode(snp,pos,place);
        return 0;
    }
    PNode NewNode = (PNode)malloc(sizeof(struct Node));
    strcpy(NewNode->snp, snp);
    strcpy(NewNode->pos, pos);
    strcpy(NewNode->place, place);
    if(n == 1)
    {
        NewNode->next = Head;
        PNode _np = getLast(Head);
        _np->next = NewNode;
        Head = NewNode;
    }
    else if(n <= num)
    {
        PNode np = getNum(n);
        PNode _np = getNum(n-1);
        NewNode->next = np;
        _np->next = NewNode;
    }
    else
    {
        PNode ln = getLast();
        NewNode->next = ln->next;
        ln->next = NewNode;
    }
    return NewNode;
    puts("Successful");
}
 
PNode searchInList(char* str)
{
    PNode head = Head;
    PNode p = NULL;
    do
    {
        printf("%s", Head->snp); //Для теста
        if(str == Head->snp)
        {
            puts("Test1"); //Для теста
            p = Head;
        }
        Head = Head->next;
    }while(Head->next != head);
    return(p);
}
 
int addNodeAfterName(const char* name, const char* snp, const char* pos, const char* place)
{
    if(Head == NULL)
    {
        puts("List empty");
        return 0;
    }
    PNode p = searchInList(name);
    if(p == NULL)
    {
        printf("%s not found\n", name);
        return 0;
    }
    PNode NewNode = (PNode)malloc(sizeof(struct Node));
    strcpy(NewNode->snp, snp);
    strcpy(NewNode->pos, pos);
    strcpy(NewNode->place, place);
    NewNode->next = p->next;
    p->next = NewNode;
}
 
void fReadList()
{
    FILE *in;
    char s[256];
    char n[128];
    char p[128];
    char pos[256];
    char place[256];
    int i = 1;
 
    in=fopen("list.txt", "r");
    if (in == NULL)
    {
        puts("Error. file not found");
    }
    else
    {
        while(!feof(in))
        {
            fscanf(in, "%s", s);
            fscanf(in, "%s", n);
            fscanf(in, "%s\n", p);
            fscanf(in, "%s ", pos);
            fscanf(in, "%s", place);
            strcat(s, " ");
            strcat(s, n);
            strcat(s, " ");
            strcat(s, p);
            AddNode(s, pos, place, i);
            i++;
        }
        close(in);
    }
    puts("Reading from the file was successful");
}
 
int fWriteList()
{
    FILE *out;
 
    if(Head == NULL)
    {
        puts("List empty");
        return 0;
    }
    out = fopen("list.txt", "w");
    PNode head = Head;
    PNode _head = getLast();
    do
    {
        fprintf(out, "%s %s %s", Head->snp, Head->pos, Head->place);
        if(Head != _head) fprintf(out, "\n");
        Head = Head->next;
    } while(Head != head);
    puts("The writing to the file was successful");
    close(out);
}

int printList()
{
    if(Head == NULL)
    {
        puts("List empty");
        return 0;
    }
    int i = 1;
    PNode head = Head;
    puts(" _____________________________________________________________________________");
    puts("| |                                        |              |                   |");
    puts("|N|               Name                     |   Position   |       Place       |");
    puts("|_|________________________________________|______________|___________________|");
    do
    {
        printf("|%-1d|%-40s|%-14s|%-19s|\n", i, Head->snp, Head->pos, Head->place);
        puts("|_|________________________________________|______________|___________________|");
        i++;
        Head = Head->next;
    } while(Head != head);
}
 
int clearList()
{
    if(Head == NULL)
    {
        puts("List empty");
        return 0;
    }
    PNode head = Head;
    do
    {
        strcpy(Head->snp, "0");
        strcpy(Head->pos, "0");
        strcpy(Head->place, "0");
        Head = Head->next;
    } while(Head != head);
    puts("List successfully cleared");
}
 
int freeList()
{
    if(Head == NULL)
    {
        puts("List empty");
        return 0;
    }
    PNode mainHead = getLast();
    PNode _Head = NULL;
    while(Head != mainHead)
    {
        _Head = Head;
        Head = Head->next;
        free(_Head);
    }
    free(mainHead);
}
 
int main()
{
    int num;
    char val=' ';
    char snp[256];
    char pos[256];
    char place[256];
    for(;;)
    {
        while(val != '1' && val != '2' && val != '3' && val != '4' && val != '5' && val != '6' && val != '0')
        {
            puts(" ----------Menu-------------------");
            puts("| 1. Add a new item by number     |");
            puts("| 2. Print list                   |");
            puts("| 3. Clear list (=0)              |");
            puts("| 4. Read from file               |");
            puts("| 5. Write to file                |");
            puts("| 6. Add a new item after somebody|");
            puts("| 0. Exit                         |");
            puts(" ---------------------------------");
            scanf("%s", &val);
        }
        if(val == '1')
        {
            printf("Surname Name Patronymic\n");
            fflush(stdin);
            gets(snp);
            printf("Position\n");
            fflush(stdin);
            gets(pos);
            printf("Place\n");
            fflush(stdin);
            gets(place);
            printf("Number\n");
            scanf("%d", &num);
            AddNode(snp, pos, place, num);
            val = ' ';
        }
        if(val == '2')
        {
            printList();
            val = ' ';
        }
        if(val == '3')
        {
            clearList();
            val = ' ';
        }
        if(val == '4')
        {
            if(Head != NULL)
            {
                freeList();
                Head = NULL;
            }
            fReadList();
 
            val = ' ';
        }
        if(val == '5')
        {
            fWriteList();
            val = ' ';
        }
        if(val == '6')
        {
            char str[256];
            printf("After whom we will add? Enter the Surname Name Patronymic\n");
            fflush(stdin);
            gets(str);
            PNode p = searchInList(str);
            if(p == NULL) puts("Person not found"); //Для теста
            else puts("OK"); //Для теста
            val = ' ';
        }
        if(val == '0') break;
    }
    freeList();
    Head = NULL;
}

Решение задачи: «Поиск элемента односвязного списка по значению поля (я в отчаянии.)»

textual
Листинг программы
PNode searchInList(char* str)
{
    PNode p = Head;
    if(p==NULL)
        return NULL;
    do
    {
        printf("%s\n", p->snp); //Для теста
        if(strcmp(str,p->snp)==0)
        {
            puts("Test1"); //Для теста
            return(p);
        }
        p = p->next;
    }while(p != Head);
    return NULL;
}

Объяснение кода листинга программы

  1. Функция searchInList принимает на вход указатель на строку str.
  2. В первой строке функции объявляется переменная p типа PNode и инициализируется значением Head.
  3. Если p равно NULL, то возвращается NULL, иначе начинается цикл.
  4. В цикле do-while происходит обход списка до тех пор, пока p не станет равным NULL.
  5. Внутри цикла выводится значение поля snp текущего элемента списка с помощью функции printf.
  6. Сравнивается значение поля snp текущего элемента списка со значением str с помощью функции strcmp.
  7. Если strcmp возвращает 0, то это значит, что значение поля snp равно str, и функция возвращает текущий элемент списка с помощью return(p);.
  8. Если strcmp возвращает не 0, то значение p присваивается значение p->next, т.е. переходим к следующему элементу списка.
  9. После окончания цикла, если не было найдено совпадение, функция возвращает NULL.
  10. Функция вызывается с аргументом test.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы