Проблема со связанным списком / указателями - PullRequest
0 голосов
/ 18 сентября 2011

У меня сейчас проблема со связанным списком и указателями на C. Проблема, с которой я столкнулся, заключается в добавлении данных в связанный список. В настоящее время у меня есть:

struct str_pair{ 
char ip  [50] ;
char uri [50] ;
struct str_pair *next ;
};

struct str_pair *it ;

struct str_pair *header = NULL; // Start of linked list
struct str_pair *ptr; // Moves along the list
struct str_pair *ptr2; // Another pointer
struct str_pair *ptr3;

void addData(char *addURI, char *addIP){

    struct str_pair *tmp, *tmp2;

    tmp = (str_pair*)malloc(sizeof(str_pair)); // Create new space in str_pair
    strncpy(tmp->uri, addURI, 49);
    strncpy(tmp->ip, addIP, 49);
    tmp->next = NULL;

    if (header == NULL) { header = tmp; }
    else
    {
        tmp2 = header;
        while (tmp2->next != NULL) { tmp2 = tmp2->next; }
        tmp2->next = tmp;
    }
}

Я пытаюсь передать URL-адрес и IP-адрес через параметры, в которых он должен добавить эти значения в связанный список.

Вот код, который вызывает эту функцию:

int main(int argc, char *argv[])
{
    int incrItems=0;
    int j;

    header = NULL;

    for(j = 1; j < argc; j++)
    {
        char ch=argv[j][0];

        switch(ch)
        {
        case 'A' :
            {
                char *newURI = argv[j+1];
                char *newIP = argv[j+2];
                incrItems++;
                addData(newURI,newIP);
                j=j+2;
                break;
            }

*Snipped the rest as its unnecessary*

У меня проблема в том, что переданные аргументы не добавляются в связанный список. При компиляции ошибки не отображаются.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2011

Если вы внутри for, почему вы увеличиваете переменную j?Кроме того, попробуйте поместить несколько printf в функцию добавления, чтобы узнать, верны ли аргументы.

0 голосов
/ 18 сентября 2011

Хотя приятные подсказки предоставлены wildplasser, но код работает отлично.

int main(int argc, char *argv[])
{
    int incrItems=0;
    int j;

    header = NULL;

    for(j = 1; j < argc; j++)
    {
        char ch=argv[j][0];

        switch(ch)
        {
        case 'A' :
            {
                char *newURI = argv[j+1];
                char *newIP = argv[j+2];
                incrItems++;
                printf(" Adding %s %s\n", newURI, newIP);
                addData(newURI,newIP);
                j=j+2;
                break;
            }
        }
     }
printf(" J at end is %d\n",j);

it = header;
if(it != NULL)
do {
        printf(" %s %s\n",it->ip, it->uri);
        it = it->next;
}while(it != NULL);

    }
0 голосов
/ 18 сентября 2011
for(j = 1; j < argc; j++)
    {
    switch(argv[j][0]) { /* no need to copy */
    case 'A' :
            incrItems++;
            /* assert (j+2 < argc); */
            addData(argv[j+1], argv[j+2]); /* no need to copy */
            j=j+2;
            break;
    case 'B' :
    default:
      ...
            break;
        }
     }

РЕДАКТИРОВАТЬ: Примечание: выше не решение , просто подсказка.Еще один намек:

#include <stdlib.h>
#include <string.h>

void addData(char *addURI, char *addIP){

    struct str_pair *tmp, **hnd;

    tmp = malloc(sizeof *tmp);
    /* assert (tmp != NULL); */
    strncpy(tmp->uri, addURI, 49); tmp->uri[49] = 0;
    strncpy(tmp->ip, addIP, 49); tmp->ip[49] = 0;
    tmp->next = NULL;

    for (hnd = &header; *hnd; hnd = &(*hnd)->next) {;}
    *hnd = tmp;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...