1

私は出力を持っています:

ノード 1: ボブ ジョー ジル ジェフ ジル

しかし、単一リンクリストの先頭に送信される名前が繰り返される場合、どこにそれが欲しいので、それは

ノード 1: ジル ボブ ジョー ジェフ

そして、私はそれを実装することができません。

これが私のコードです:

string employers[] = {"Jill", "Jeff", "Bob", "Joe", "Monica", "Luis"}; 

struct node {
    node(string name="") {data=name; next=NULL; }

    string data;

    node *next;
    node *prev;
};


class list {
public:
    list(int N=0, int value=0);
    ~list();

    void put(int);
    friend ostream & operator << (ostream &, const list &);

private:
    int N;
    node *head;

};



void list::put(int i) {
    string employee_name = employers[i];
    node * p = new node(g);
    node * pp = head;

    while (pp - > next) {


        pp = pp - > next;
        for (int b=6; b<6; b++) {
           if (p-> data == names[b]
             cout << "found";
    }

    pp - > next = p;

    N++;

}

私が抱えている問題は、リンクされたリストの各エントリをどのように比較できるかということです。ノード *prev を作成しましたが、ノードを比較する方法がよくわかりません。

4

2 に答える 2

0
  1. 常に小さな関数を書く
  2. 関数が大きく見える場合は、常に小さな関数に分割します
  3. グローバル データを避けるようにしてください。必要に応じて、グローバル値を直接操作するのではなく、グローバル値を渡すようにしてください。

これがあなたの解決策です。検索機能を追加し、ポインタ管理を修正しました。

class list {
public:
    list():head(NULL), N(0){}
    ~list(){
    //Implementation for cleanup
     }

void put(int i){ //left this function so that your code wont break but try removing it
  put(employee_names[i]);
}

void put(string name){  //rather than accessing the global data, use the value passed
    node* p = new node(name);
    p->next=p->prev=NULL;
    node* pp = find(name);
    if(pp==NULL){
      // No match found, append to rear
      if(head==NULL)
        head=p;  //list empty, add first element
      else{
        node* cur=head;
        while(cur->next!=NULL) //Keep looking until a slot is found
          cur=cur->next;
        cur->next=p;
        p->prev=cur;
      }
    }
    else{
        //Match found, detach it from its location
        node* pPrev = pp->prev;
        pPrev->next = pp->next;
        pp->next->prev=pPrev;
        p->next = head; //append it to the front & adjust pointers
        head->prev=p;
    }
    N++;
    }

    //MER: finds a matching element and returns the node otherwise returns NULL
    node* find(string name){
        node *cur=head;
        if(cur==NULL) // is it a blank list?
          return NULL;
        else if(cur->data==head) //is first element the same?
          return head;
        else   // Keep looking until the list ends
          while(cur->next!=NULL){
          if(cur->data==name)
            return cur;
            cur=cur->next;
          }
        return NULL;
}
friend ostream& operator << (ostream& os, const list& mylist);

private:
    int N;
    node *head;

};

ここで、STL のリストを使用して独自のコードを記述しないように言う人もいるかもしれませんが、STL に勝るものはありませんが、実際にどのように機能するかについて明確なアイデアを得るために独自のコードを実装しているのは良いことです。

于 2013-09-24T05:19:21.130 に答える