создание очереди указателей в c - PullRequest
0 голосов
/ 05 мая 2011

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

struct Node{
    int *k;
Node*Next;
}

struct LS{
    Node*first,*last;
    void push(Node*n);
    Node* GetFirst();
    Node* GetLast();
}

LS - это связанный список, в котором хранятся узлы.и Node - это структура, которая содержит адрес моего указателя и указатель на следующий узел.
Использую ли я int * k для правильного хранения адреса моего указателя?Должен ли я продолжить эту реализацию или есть более простой способ сделать это?

Ответы [ 3 ]

1 голос
/ 05 мая 2011

этот пример кода может помочь вам начать ...

#include <stdio.h>  

struct Node{
int *k;
Node *Next;
}* Temp;
struct LS
{
Node *first,*last;
void push(Node *MyNode)
{
    MyNode->Next=NULL;
    if(empty())
    {
        first=MyNode;
        last=MyNode;
    }
    else
    {           
        last->Next = MyNode;
        last=MyNode;
    }
}
Node* front()
{
    return first;
}
void pop()
{   
    free(first->k);
    first=first->Next;      
}
bool empty()
{       
    if(first==NULL) return true;    
    return false;
}
};
int N=10;

int main() 
{
LS Q;Q.first=NULL;
for(int i=0;i<3;i++)
{
    Node *NewNode= (Node*)malloc(sizeof(Node));
    NewNode->k = (int*)malloc(sizeof(int)*N);
    for(int k=0;k<N;k++) NewNode->k[k]=i;
    Q.push(NewNode);
}
while(!Q.empty())
{
    Temp=Q.front(); 
    for(int i=0;i<N;i++) printf("%d ",Temp->k[i]);
    printf("\n");
    Q.pop();
}

return 1;
}
0 голосов
/ 05 мая 2011

WDM.H (заголовок microsoft) имеет кучу связанных списков, которые нужно посмотреть (http://msdn.microsoft.com/en-us/library/ff547799(VS.85).aspx), я вырезал и вставил из этого и добавил очень простой пример.

typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY;

typedef struct _MY_THING
{
    LIST_ENTRY           ListEntry;
    ULONG                randomdata1;
    ULONG                randomdata2;
    ULONG                randomdata3;
    ULONG                randomdata4;
} MY_THING, *PMY_THING;

#define CONTAINING_RECORD(address, type, field) ((type *)( \
                                                  (PCHAR)(address) - \
                                                  (ULONG_PTR)(&((type *)0)->field)))


VOID
InsertHeadList(
    IN PLIST_ENTRY ListHead,
    IN PLIST_ENTRY Entry
    )
{
    PLIST_ENTRY Flink;

    Flink = ListHead->Flink;
    Entry->Flink = Flink;
    Entry->Blink = ListHead;
    Flink->Blink = Entry;
    ListHead->Flink = Entry;
}

VOID
InitializeListHead(
    IN PLIST_ENTRY ListHead
    )
{
    ListHead->Flink = ListHead->Blink = ListHead;
}

PLIST_ENTRY
RemoveHeadList(
    IN PLIST_ENTRY ListHead
    )
{
    PLIST_ENTRY Flink;
    PLIST_ENTRY Entry;

    Entry = ListHead->Flink;
    Flink = Entry->Flink;
    ListHead->Flink = Flink;
    Flink->Blink = ListHead;
    return Entry;
}



void main()
{
    LIST_ENTRY HeadOfMyList;
    MY_THING Thing; 

    InitializeListHead(&Head);
    // example of add thing to list.    
    InsertHeadList(&HeadOfMyList, &Thing.ListEntry);

    // example of removing thing from the list
    PLIST_ENTRY listEntry = RemoveHeadList(&HeadOfMyList);
    PMY_THING pThing = (PMY_THING) CONTAINING_RECORD(listEntry, MY_THING, ListEntry);
}
0 голосов
/ 05 мая 2011

Да, ваша структура узла верна.

Относительно того, существует ли более простой способ, это зависит.Если вам понадобится максимальное количество указателей, то массив указателей будет проще.Если вы можете сделать это в C ++, тогда вектор STL (может использовать его как массив, но под капотом он может динамически расти по мере необходимости) будет проще.Если вам нужно сделать это в C, и это должно быть динамично, то нет, более простого способа нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...