2017-10-29 12 views
0

私はCの新人です。現時点では私にとってロケット科学のようなものなので、もっとよく理解しようとしています。複数のリンクされたリスト

私は、以下のリンクリストの実装があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#include "linked_list.h" 

struct Node *head = NULL; 
struct Node *current = NULL; 

//display the list 
void printList() { 
    struct Node *ptr = head; 
    printf("\n[ "); 

    //start from the beginning 
    while (ptr != NULL) { 
     printf("(%d,%d) ", ptr->key, ptr->data); 
     ptr = ptr->next; 
    } 

    printf(" ]"); 
} 

//insert link at the first location 
void insertFirst(int key, int data) { 
    //create a link 
    struct Node *link = (struct Node*) malloc(sizeof(struct Node)); 

    link->key = key; 
    link->data = data; 

    //point it to old first Node 
    link->next = head; 

    //point first to new first Node 
    head = link; 
} 

//delete first item 
struct Node* deleteFirst() { 

    //save reference to first link 
    struct Node *tempLink = head; 

    //mark next to first link as first 
    head = head->next; 

    //return the deleted link 
    return tempLink; 
} 

//is list empty 
bool isEmpty() { 
    return head == NULL; 
} 

int length() { 
    int length = 0; 
    struct Node *current; 

    for (current = head; current != NULL; current = current->next) { 
     length++; 
    } 

    return length; 
} 

//find a link with given key 
struct Node* find(int key) { 
    //start from the first link 
    struct Node* current = head; 

    //if list is empty 
    if (head == NULL) { 
     return NULL; 
    } 

    //navigate through list 
    while (current->key != key) { 

     //if it is last Node 
     if (current->next == NULL) { 
      return NULL; 
     } 
     else { 
      //go to next link 
      current = current->next; 
     } 
    } 

    //if data found, return the current Link 
    return current; 
} 

//delete a link with given key 
struct Node* delete(int key) { 
    //start from the first link 
    struct Node* current = head; 
    struct Node* previous = NULL; 

    //if list is empty 
    if (head == NULL) { 
     return NULL; 
    } 

    //navigate through list 
    while (current->key != key) { 

     //if it is last Node 
     if (current->next == NULL) { 
      return NULL; 
     } 

     //store reference to current link 
     previous = current; 
     //move to next link 
     current = current->next; 
    } 

    //found a match, update the link 
    if (current == head) { 
     //change first to point to next link 
     head = head->next; 
    } 
    else { 
     //bypass the current link 
     previous->next = current->next; 
    } 

    return current; 
} 

void sort() { 
    int size = length(); 
    int k = size; 

    for (int i = 0; i < size - 1; i++, k--) { 
     struct Node *current = head; 
     struct Node *next = head->next; 

     for (int j = 1; j < k; j++) { 
      if (current->data > next->data) { 
       int temp_data = current->data; 
       current->data = next->data; 
       next->data = temp_data; 

       int temp_key = current->key; 
       current->key = next->key; 
       next->key = temp_key; 
      } 

      current = current->next; 
      next = next->next; 
     } 
    } 
} 

を私が唯一、独自の主な機能には、このコードで1つのリンクリストを作ることができること、しかし実現。

私は別のクラスで使用するためにヘッダーを作成しました(例えば、Javaのように、異なるタイプの複数のリンクリストが必要です)。

#pragma once 
typedef struct Node { 
    int data; 
    int key; 
    struct Node *next; 
} Node; 

void printList(); 
void insertFirst(int key, int data); 
struct Node* deleteFirst(); 
bool isEmpty(); 
struct Node* find(int key); 
struct Node* delete(int key); 
void sort(); 

しかし、私はそれが複数のリンクされたリストのためにどのくらい正確に動作するかまだよく分かりません。何か案は?

+0

に消費税などの他の機能を残すだけでなく、パラメータとして関数にそれを渡す 'head'変数、各リストのための1つ。そしてそれを関数に渡します。または、リストの構造体(私の助言)を使用して、構造体にリスト関数を渡します(ポインタ)。 –

+0

@Someprogrammerdude可能であれば、いくつかのコードを投稿して、それをよりよく理解できますか?ありがとう – Denki

+0

これは、グローバルを使用しない理由の非常に良い例です。 – klutt

答えて

1

先頭と現在を含む構造体を作成します。

すなわち

typedef struct { 
    struct Node *head; 
    struct Node *current; 
} MyList; 

MyList *CreateMyList() { 
    MyList * list= malloc(sizeof(MyList)); 
    list->current = list->head = NULL; 
    return list; 
} 


void insertFirst(MyList *list, int key, int data) { 
    //create a link 
    struct Node *link = malloc(sizeof(struct Node)); 

    link->key = key; 
    link->data = data; 

    //point it to old first Node 
    link->next = list->head; 
    //point first to new first Node 
    list->head = link; 
} 

Iが複数作成リーダ

+0

mallocのキャストを削除しました。 –

+0

うまくいきました。 int以外のさまざまなデータ型で動作させる方法はありますか?リストに構造体を入れる必要がある – Denki

+1

C++に移動するか、データ型にvoidポインターを使用する - それは後でお薦めしません –

2

このコードでは、グローバル変数を使用してメソッドを再び使用できなくしました。だからあなたができることは、グローバル変数の使用を避けてコードを書き直すことです。どのようなグローバル変数がこれらのメソッドによって使用されても、メソッドに応じてそれを渡すだけです。あなたはそれを再利用することができます。

関連する問題