скопировать элементы массива в связанный список в C - PullRequest
0 голосов
/ 05 декабря 2011

У меня есть массив, я хочу создать из него двусвязный список, перенеся мои элементы в узлы. и связывая их через указатели (предыдущая и следующая) то, что я сделал, было

head = malloc (sizeof (struct)) head-> пред = NULL head-> следующая = NULL хвост = голова

for(i=0;i<num;i++){
    //copy data from arr[i] to tail
    temp=tail
    tail->next=malloc(sizeof(struct))
    tail=tail->next
    tail->prev=temp
}

Теперь, как мне скопировать данные? темп, голова и хвост являются указателями на структуру

Ответы [ 3 ]

2 голосов
/ 05 декабря 2011

Полагаю, вы не пробовали писать и компилировать. Элементы связанного списка должны иметь хотя бы некоторое место для хранения значения из вашего массива, скажем, данные типа int.

#include <stdio.h>
#include <malloc.h>
#define N 3

typedef struct a{
struct a* prev;
struct a* next;
int data;
}item;

int main(void)
{
item* head;
item* tail;
item* temp;
int num = N;
int data[N] = {1,2,3}; /*initialization*/
int i = 0;
head = (item*)malloc(sizeof(item));
head -> prev = NULL;
head -> next = NULL;
tail = head;
for(i = 0; i < num; i ++){
    temp = tail;
    tail -> next = (item*)malloc(sizeof(item));
    tail = tail -> next;
    tail -> next = NULL;
    tail -> data = data[i];
    tail -> prev = temp;
}
for(temp = head -> next; temp != NULL; temp = temp -> next) /*the following is for testing purpose*/
    printf("%d\t", temp -> data);
return 0;
}

Помните, что элемент head не содержит того, что вы хотите.

0 голосов
/ 05 декабря 2011

создать временный узел и проанализировать список ссылок с последнего узла назначить эти детали

counter=start_node;
     temp=(struct NODE *)malloc(sizeof(struct NODE));   /*create new node*/
                temp->node_data=data;                               /*set data in new node*/
                while(counter -> next_node!=NULL)
                {
                    counter=counter->next_node;             /*increment in counter*/
                }

          temp->prev_node=counter;          /*set next node of new node*/
          counter->next_node = temp;
          temp->next_node = null;

здесь temp - текущий узел.

0 голосов
/ 05 декабря 2011

Вам нужно сохранить tail->prev, поэтому вы можете сделать:

node * tailPrev = tail->prev;
memcpy(tail, &arr[i], sizeof(*tail));
tail->prev = tailPrev;
//continue with your code...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...