1

リンクされたリストを使用して、サブジェクトの前提条件チェッカーを作成しようとしています。単一のデータをノードに挿入する方法を知っています。

私の問題は、ノードに複数のデータを挿入する方法ですか? 私の課題に完全に適合する良い例を見つけました。しかし問題は、私が C をあまり理解していないことです。void add()以下の機能を説明するのに役立つ人はいますか? addその機能を課題に使用したい。

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

struct node
{
   char data [ 20 ];
   char m [ 5 ] [ 20 ];
   int mcount;
   struct node * link;
};

struct node * dic [ 26 ];

void add ( char * );
int  search ( char * );
void show( );
void deldic( );

void main( )
{
   char word [ 20 ] , ch;
   int i;

   clrscr( );

   while ( 1 )
   {
       clrscr( );
       printf ( "\n\t\tDictionary\n" );
       printf ( "\n\t\t1.Add Word.\n" );
       printf ( "\t\t2.Search Word.\n" );
       printf ( "\t\t3.Show Dictionary.\n" );
       printf ( "\t\t0.Exit." );
       printf ( "\n\n\t\tYour Choice ");
       scanf ( "%d", &ch );

       switch ( ch )
       {
           case 1 :

               printf ( "\nEnter any word : " );
               fflush ( stdin );
               gets ( word );
               add ( word );

               break;

           case 2 :

               printf ( "\nEnter the word to search : " );
               fflush ( stdin );
               gets ( word );
               i = search ( word );
               if ( ! i )
                   printf ( "Word does not exists." );
               getch( );

               break;

           case 3 :

               show( );
               getch( );

               break;

           case 0 :

               deldic( );
               exit ( 0 );

           default :

               printf ( "\nWrong Choice" );
       }
   }
}

void add ( char * str )
{
   int i, j = toupper ( str [ 0 ] ) - 65;
   struct node * r, * temp = dic [ j ], * q;
   char mean [ 5 ] [ 20 ], ch = 'y';

   i = search ( str );
   if ( i )
   {
       printf ( "\nWord already exists." );
       getch( );
       return;
   }
   q = ( struct node * ) malloc ( sizeof ( struct node ) );
   strcpy ( q -> data, str );
   q -> link = NULL;

   for ( i = 0; tolower ( ch ) == 'y' && i < 5; i++ )
   {
       fflush ( stdin );
       printf ( "\n\nEnter the meaning(s) : " );
       gets ( mean [ i ] );
       strcpy ( q -> m [ i ] , mean [ i ] );
       if ( i != 4 )
           printf ( "\nAdd more meanings (y/n) " );
       else
           printf ( "You cannot enter more than 5 meanings." );
       fflush ( stdin );
       ch = getche( );
   }

   q -> mcount = i;
   if ( dic [ j ] == NULL || strcmp ( dic [ j ] -> data, str ) > 0 )
   {
       r = dic [ j ];
       dic [ j ] = q;
       q -> link = r;
       return;
   }

   else
   {
       while ( temp != NULL )
       {
           if ( ( strcmp ( temp -> data, str ) < 0 ) && ( ( strcmp ( temp -> link -> data, str ) > 0 ) ||
                                           temp -> link == NULL ) )
           {
               q -> link = temp -> link;
               temp -> link = q;
               return;
           }
           temp = temp -> link;
       }
   }
}

これまでの私の課題は次のとおりです

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

struct subjectlist
{
   string subject;
   string prereq;
   subjectlist *next;
};

subjectlist *start_prt=NULL;
subjectlist *current;
int option=0;

int main ()
{
 int x;
 string subject;

               cout << "1. Add subject" << endl;
               cout << "2. Search prerequisite" << endl;
               cout << "3. Delete subject" << endl;
               cout << "4.Show subjects" << endl;
               cout << "5. Save to file" << endl;
               cout << "6. Load from file" << endl;
                 cout << "0. Exit" << endl;
               cin >> x;

               switch (x)
   {
       case 1:
           cout<<"Input subject"<<endl;
           cin >>  subject;
           add(subject);
           break;

       case 2:
           cout<<"Input subject to be checked"<<endl;
           break;

       case 3:
           cout<<"Delete a subject"<<endl;
           break;

       case 4:
           cout<<"Show Subjects"<<endl;
           break;

       case 5:
           cout<<"Save to File"<<endl;
           break;

       case 6:
           cout<<"Load from file"<<endl;
           break;

       case 0:
           cout<<"exit"<<endl;
           break;


       default: cout <<"Invalid selection, please try again."<<endl;
   }
 }

void add ()
{

}
4

2 に答える 2

1

言語であるC++を使用しているので、オブジェクト指向プログラミングをサポートするものは何ですか。この機能を使用してみませんか?

まず、保存したいすべての有用なアイテムを含むデータ構造を作成できます。また、operator ==を記述して、2つのデータオブジェクトを比較することを非常に明確にすることもできます。

struct Data
{
    char data [20];
    char m [5][20];
    int mcount;

    bool operator==(const Data& other)const
    {
        //probably you need more comparisons
        return mcount==other.mcount; 
    }
};

次に、Nodeクラス、Dataオブジェクトの1つを保持するクラス、および次の(おそらく前の)アイテムへのポインターを作成できます。

struct Node
{
    Data data;
    Node * next;
    //Node * previous;
}

これを取得したら、独自のリンクリストクラスを作成できます。

class MyLinkedList
{
    Node * head;

    public:

    MyLinkedList(){//initialization steps}

    ~MyLinkedList(){ //Delete the list}

    void add(Data item)
    {
        if(!contains(item))
        {
            //append it
        }
    }

    bool contains(Data item){ //... check if the list already contains item}

    //create a string representation of the object. 
    //If you dont like this style, you could also provide 
    //an operator>> or operator<< for the class
    std::string toString()
    {
        std::stringstream stream;
        //iterate through the list, and add elements with
        return stream.str();
    }
};

これを取得した場合、main()で、必要なものがはるかに明確になります。

MyLinkedList list;

Data data; //somehow fill it

//adding items
list.add(data);

//printing the list
cout<<list.toString();

//after it goes out of scope the destructor will be called, 
//so you dont need to bother with the deletion.
于 2012-08-23T10:06:04.750 に答える
1

このadd()関数はノードをリストに追加します。しかし、ノードをリストに追加する前に、ノード内のデータがリストに既に存在するかどうかを確認しますか?

 i = search ( str );
   if ( i )

これにより、重複データがチェックされます。
データがすでにリストに存在する場合、ノードはリストに挿入されません。

リストにデータが存在しない場合は、さらに移動します。

 for ( i = 0; tolower ( ch ) == 'y' && i < 5; i++ )

meaning (string)この for ループは配列で受け入れ、meaningノードごとに 5 しか追加できません。 また、リストがソートされた形式になるように、ノードがリストに追加されます。

于 2012-08-23T09:13:45.610 に答える