Поиск элемента односвязного списка по значению поля (я в отчаянии.) - 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; }
Объяснение кода листинга программы
- Функция
searchInList
принимает на вход указатель на строкуstr
. - В первой строке функции объявляется переменная
p
типаPNode
и инициализируется значениемHead
. - Если
p
равноNULL
, то возвращаетсяNULL
, иначе начинается цикл. - В цикле
do-while
происходит обход списка до тех пор, покаp
не станет равнымNULL
. - Внутри цикла выводится значение поля
snp
текущего элемента списка с помощью функцииprintf
. - Сравнивается значение поля
snp
текущего элемента списка со значениемstr
с помощью функцииstrcmp
. - Если
strcmp
возвращает0
, то это значит, что значение поляsnp
равноstr
, и функция возвращает текущий элемент списка с помощьюreturn(p);
. - Если
strcmp
возвращает не0
, то значениеp
присваивается значениеp->next
, т.е. переходим к следующему элементу списка. - После окончания цикла, если не было найдено совпадение, функция возвращает
NULL
. - Функция вызывается с аргументом
test
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д