Сравните отдельные символы в строках, содержащихся в соседних узлах связанного списка - PullRequest
0 голосов
/ 05 мая 2018

Я довольно новичок в C. Я пытаюсь создать программу, которая будет принимать имена веб-сайтов и имена пользователей, пока пользователь не введет EOF. По мере ввода данных они сохраняются в связанном списке, а затем список сортируется в алфавитном порядке по мере ввода на основе имени веб-сайта. Я не могу найти способ получить строки «Веб-сайт» из двух узлов и сравнить каждый символ, чтобы определить, куда следует вставить новый узел. Любая помощь будет принята с благодарностью, я пытался найти этот сайт и другие решения. Был ли я слишком амбициозным? Он компилируется, но возвращает эту ошибку после двух записей.

test.c:68:24: runtime error: null pointer passed as argument 1, which is 
declared to never be null
/usr/include/string.h:130:14: note: nonnull attribute specified here
Segmentation fault

Это как раз тот момент, когда я получил наименьшее количество ошибок. Я понимаю, что строки t & s не должны быть NULL, но любые изменения, которые я делаю, делают это еще хуже. Мой код

#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

typedef struct node
{
char *website;
char *username;
int sitelen;
int userlen;
struct node *next;
}
node;

int main(void)
{
// memory for numbers
node *list = NULL;

// Prompt for numbers (until EOF)
while (true)
{
    // Prompt for number
    char *site = get_string("Website: ");
    // Check for EOF
    if (strcmp(site, "") == 0)
    {
        break;
    }
    char *user = get_string("Username: ");
    // Check whether website is already in list
    bool found = false;
    for (node *ptr = list; ptr != NULL; ptr = ptr->next)
    {
        if (ptr->website == site)
        {
            found = true;
            printf("Website already present");
            break;
        }
    }
    // If number not found in list, add to list
    if (!found)
    {
        // Allocate space for number
        node *nw = malloc(sizeof(node));
        if (!nw)
        {
            return 1;
        }
        // Add details to list
        nw->website = site;
        nw->username = user;
        nw->next = NULL;
        int m = strlen(site);
        if (list)
        {   // if list head of list exists
            node *pre = NULL; // pre pointer
            string t = NULL;
            strcpy(t, nw->website); // t is newly entered website in lowercase string
            for (node *ptr = list; ptr != NULL; pre  = ptr, ptr = ptr->next)
            {   // move along linked list
                string s = NULL;
                strcpy(s, ptr->website); // t is newly entered website in lowercase string
                if (ptr != list && !ptr->next)
                {   // end of list, place new node
                    ptr->next = nw;
                    break;
                }
                else
                {   // compare websites to see if node remains or ptr moves on
                    for (int y = m + 1, i = 0; i < y;)
                    {   // if a website starts the same but is shorter it is inserted
                        if (ptr == list && t[i] < s[i])
                        {
                            nw->next = list;
                            list = nw;
                            break;
                        }
                        else if (t[i] < s[i])
                        {
                            nw->next = ptr->next;
                            pre->next = nw;
                            break;
                        }
                        else if (t[i] == s[i])
                        {
                            i++;
                        }
                        else
                        {
                            break;
                        }
                    }
                    break;
                }
            }

        }
        else
        {   // first itteration assigns list to nw
            list = nw;
        }
    }
}
node *ptr = list;
while (ptr != NULL)
{
    node *next = ptr->next;
    free(ptr);
    ptr = next;
}

}
...