0

リンクリストを操作するコードを書いています。しかし、36行目でキャストなしでポインターから整数を作成しているため、コンパイルされません。なぜこれが起こっているのかわかりません。しかし、新しい文字をリストに追加する機能「Ins」に影響しています。どう考えているか教えてください。

関数 del、fde、pst、prl、pcr、ppr、および psu は無視してください。私はまだそれらに到達していません。邪魔になるべきではありません。ありがとう

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MIN_LENGTH 4
#define MAX_LENGTH 11

struct node{
     char list;
    int count;
       struct node *next;
 };
typedef struct node Node;
typedef Node *ListNode;

void ins(ListNode *ptr, char value);

int main(void){

  ListNode startPtr = NULL;

  char com[MIN_LENGTH];
  char cho[MAX_LENGTH];

  while(strcmp(com, "end") != 0){
    printf("Command? ");
    scanf("%s", &com);

     if(strcmp(com, "ins") == 0){
       scanf("%s", &cho);
       ins(&startPtr, cho);
       printf("%s", cho);

        }

      else if(strcmp(com, "del") == 0){
    // del();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "fde") == 0){
    // fde();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "pst") == 0){
    // pst();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "prl") == 0){
    // prl();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "pcr") == 0){
    // pcr();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "ppr") == 0){
    // ppr();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }
      else if(strcmp(com, "psu") == 0){
    // psu();
       scanf("%s", &cho);
       printf("%s\n", cho);
        }

    else if(strlen(com) >= 4 || strlen(com) < 3){
    printf("You have entered an incorrect command.\n");
    }
  }
}


void ins(ListNode *ptr, char value){

  ListNode newPtr;
  ListNode prevPtr;
  ListNode currPtr;

    newPtr = (struct node*) malloc(sizeof(Node));

    if(newPtr != NULL){
    newPtr->list = value;
    newPtr->next = NULL;

    prevPtr = NULL;
    currPtr = *ptr;

    while(currPtr != NULL && value > currPtr-> list){
      prevPtr = currPtr;
      currPtr = currPtr->next;
    }
    if(prevPtr == NULL){
      newPtr->next = *ptr;
      *ptr = newPtr;
    }
    else{
      prevPtr->next = newPtr;
      newPtr->next = currPtr;
    }
   }
    else{
      printf("No memory available\n");
    }
}
void del(){
}
void fde(){
}
void pst(){
}
void prl(){
}
void pcr(){
}
void ppr(){
}
void psu(){
}
4

3 に答える 3

0

構造体ノードに char* を含めるように宣言します。

struct node{
    char* list;
    int count;
    struct node *next;
};

ins() 関数宣言を変更します。

void ins(ListNode *ptr, char* value);

正しいパラメータで ins() を呼び出します。

main(void) {
//...
       ins(&startPtr, cho);
//...
}

ins() 関数を定義して、渡されたデータ文字列にスペースを割り当てます。

void ins(ListNode *ptr, char* value){
//...
    newPtr->list = strdup(value);
//...
}

ins() で宣言された 3 つのポインターがありますが、典型的な単一のリンクされたリストの挿入には 2 つしか必要ありません。

    ListNode newPtr;
    ListNode prevPtr; //we will omit this
    ListNode currPtr;

もう少し詳しく見てみると、newPtr は新しく割り当てられたリスト Node であり、これを malloc し、malloc が成功したかどうか (良いこと) を確認します。そして、リストの最後を探してリストをたどる方法として prevPtr と currPtr を使用しているようです (リストの先頭はしばしば末尾と呼ばれます)。これは実行可能なソリューションですが、単純化できます。

これは、新しいノードを構築する関数です。

ListNode NodeNew(char* value)
{
    ListNode newPtr;
    if( (newPtr = (struct node*) malloc(sizeof(Node))) == NULL )
    {
        printf("ENOMEM memory available\n");
        return newPtr=NULL;
    }
    newPtr->list = strdup(value);
    newPtr->next = NULL;
    newPtr->count = 0;
    return newPtr;
}

そして、これはより単純なリストの挿入です。

void ins(ListNode *head, char* value)
{
    ListNode newPtr;
    ListNode prevPtr;
    ListNode currPtr;

    if( !(newPtr = NodeNew(value)) )
    {
        return;
    }
    if(*head == NULL)
    {
        *head = newPtr;
    }
    else
    {
        for( currPtr=*ptr; currPtr->next != NULL; )
        {
            currPtr = currPtr->next;
        }
        currPtr->next = newPtr;
    }
}

そして、リスト印刷(prl)を実装したい、

void prl(ListNode head){
    ListNode currPtr;
    for( currPtr=head; currPtr != NULL; )
    {
        printf("n:%s\n",currPtr->list);
        currPtr = currPtr->next;
    }
}
于 2013-10-25T02:37:42.677 に答える