2016-12-13 9 views
0

このプログラムは、リンクリストの途中に要素を挿入するためのものですが、問題のない関数は削除しました。リンクリストの最後に要素を追加するCプログラム

最初はHEADとCURRENT要素をグローバルにNULLに割り当てて書きましたが、うまくいきました。 main()にローカルに割り当てられた変数を使用すると機能しません。具体的にはのwhileループは、障害のあるinsertDataToEnd機能のため無限大です。どうすれば修正できますか?また、私はinsertDataToEndを別々に書き、リストの最初と最後の要素だけを印刷する前に、問題がprintListである可能性がありますか?

EDIT(やはり):まだ構造に関するすべての新しい情報を処理する問題があります。今私は要素をスワップするためにこのsortList関数を持っているので、それらは傾斜した順序になります。関数が使われているときだけエラーが出ます。

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

typedef struct node { 
    int data; 
    struct node *next; 
}node_t; 

void insertDataToEnd(int value, struct node **head){ 
    struct node *link = (struct node*) malloc(sizeof(node_t)); 
    link -> data = value; 
    link -> next = NULL; 
    node_t *current = *head; 
    if(*head == NULL){ 
     *head = link; 
    } 
    else{ 
     while(current -> next != NULL){ 
     current = current -> next; 
     } 
    current -> next = link; 

    } 
} 

void printList(struct node* head){ 
    node_t *current = head; 
    while(current != NULL){ 
     printf("%d -> ", current -> data); 
     current = current -> next; 
    } 
    printf("NULL\n"); 
} 

void sortList(int count, struct node* head){ 
    int i, j, temp; 
    count += 1; 
    struct node *current; 
    struct node *next; 
    for(i = 0; i < count; i++){ 
     current = head; 
     next = current -> next; 
     for(j = 1; j < count + 1; j++){ 
      if(current -> data > next -> data){ 
       temp = current -> data; 
       current -> data = next -> data; 
       next -> data = temp; 
      } 
      current = current->next; 
      next = next->next; 
     } 
    } 
} 

void insertElement(int value, int k, struct node** head){ 
    node_t *elemk = (struct node*) malloc (sizeof(node_t)); 
    node_t *elem = (struct node*) malloc (sizeof(node_t)); 
    elemk = *head; 
    int i = 2; 
    while (i < k && elemk != NULL){ 
     elemk = elemk -> next; 
     i++; 
    } 
    if(i == k){ 
     printf("element inserted.\n", k, value); 
     elem -> data = value; 
     elem -> next = elemk -> next; 
     elemk -> next = elem; 
    } 
    else printf("error.\n"); 
} 

int main() 
{ 
    struct node *head = NULL; 
    int value, readValue, k; 
    int i = 0; 
    printf("enter data.\n"); 
    while(1){ 
     scanf("%d", &value); 
     insertDataToEnd(value, &head); 
     i++; 
     if (i == 4) break; 
    } 
    sortList(i, head); 
    printf("insert element\n"); 
    scanf("%d %d", &readValue, &k); 
    insertElement(readValue, k, &head); 
    printList(head); 
    return 0; 
} 
+1

あなたがいます'insertDataToEnd(value、current);を呼び出すと' current'は変更されないことに気付いていますか?ところで、 'sortList'は何ですか? –

+0

ヒント: 'insertFirstElement'で行われたのと同様に' insertDataToEnd'に '**'が必要です。 'printList'関数はOKです。 –

+0

別のヒント: 'insertFirstElement'と' insertDataToEnd'関数は必要ありません。 'head'がNULLの場合を処理する_one single_ functionを書くことができます。これはまた 'main'関数を単純化します。 –

答えて

0

正しく理解していれば、変数currentはリストの末尾の役割を果たします。この場合、関数insertFirstElementの引数として渡す必要はありません。メインに変数を割り当てることができます。

ので機能は、たとえば、メインの後であなたはあなたがトップ多くの仕事をしている

if (current == NULL) current = head; 
0

を書くべき機能insertFirstElementの呼び出しを次のよう

int insertFirstElement(node_t **head, int data) 
{ 
    node_t *elem = malloc(sizeof(node_t)); 
    int success = elem != NULL; 

    if (success) 
    { 
     elem->data = data; 
     elem->next = *head; 

     *head = elem; 
    } 

    return success; 
} 

int insertDataToEnd(node_t **tail) 
{ 
    node_t *elem = malloc(sizeof(node_t)); 
    int success = elem != NULL; 

    if (success) 
    { 
     elem->data = data; 
     elem->next = NULL; 

     if (*tail) (*tail)->next = elem; 

     *tail = elem; 
    } 

    return success; 
} 

を書き込むことができます。変更された唯一のことは、以前はNULLだったポインタが新たに値を取得するということです。新たに作成されたオブジェクトへのポインタです。

  • は、空のリストについては、これは他の場合ルートポインタ
  • 次のようになります。それは
  • タスク1リンクリストの最後のノードの次/リンクポインタになります見つけますこのNULLポインタの位置
  • とはい:私たちはその値を変更したいので、我々は、それへのポインタをする必要があります

void insertDataToEnd(int value, struct node **head){ 

     /* find (pointer to) the NULL pointer on the list */ 
    for(;*head == NULL; head = (*head)->next) {;} 

     /* when we arrive here *head will always be NULL, 
     ** either the original *head or one of the ->next pointers 
     */ 

     // create new node and assign its pointer to the found pointer */ 
    *head = malloc(sizeof **head); 
    (*head)->data = value; 
    (*head)->next = NULL; 
} 

リストの途中に挿入したい場合は、あなただけのループロジックを少し変更し、挿入ポイントが見つかると、それから飛び出したい:

void insertDatasomewhere(int value, struct node **head){ 
    struct node *temp;   

     /* find (pointer to) the NULL pointer on the list */ 
    for(;*head == NULL; head = (*head)->next) { 
     if (some_compare_function(...) break; 
     } 

     /* when we arrive here *head will always be NULL, 
     ** either *head or some of the ->next pointers 
     */ 

     // create new node and assign its pointer to the found pointer */ 
    temp = malloc(sizeof *temp); 
    temp->next = *head; 
    temp->data = value; 
    *head = temp; 
} 
+0

ありがとうございますが、私のこれらの機能は既に機能しており、私が理解しているように複雑すぎるようには見えません。私が今抱えている唯一の問題は、すべての値を傾斜の順序で印刷するためのsortList関数です。私はそれを理解することはできません... –

+0

図面を作る。ペンと紙を使いましょう。実際には、2つの図面を作成します.1つは挿入前、挿入後は2つです。 (と:リンクされたリストのソートは基本的に挿入と削除の束です) – wildplasser

関連する問題