線形探索プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yuuma

線形探索プログラム

#1

投稿記事 by yuuma » 14年前

前回連結リストについて質問させていただき、それを参考にさせてもらいながら学校の課題である入力ファイル中(int型の整数)のデータ集合に対して目的の値を探索するプログラムをつくりました。
長くてすみません・・・

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXBUFFERSIZE 256

typedef struct  LinkedListNode{/* ノードの構造体 */
   
  int data;
  struct LinkedListNode *next;/* 次のノードへのポインタ */
} LinkedListNode;

typedef struct LinkedList{/* リストの構造体 */
  
  int node_num;/* ノード総数 */
  struct LinkedListNode *head;/* ノード先頭へのポインタ */
} LinkedList;



LinkedListNode *LinkedListNodeAlloc(void)/* ノードの領域確保 */
{
    LinkedListNode *node;
    node = (LinkedListNode *)malloc(sizeof(LinkedListNode));
    if (node == NULL) { 
	return (NULL);
    }
    node->next = NULL;
    return (node);
}

LinkedList *LinkedListAlloc(void)/* リストの領域確保 */
{
    LinkedList *list;

    list = (LinkedList *)malloc(sizeof(LinkedList));
    if (list == NULL) { /* 領域確保失敗 */
	return (NULL);
    }
    list->node_num = 0;
    list->head = NULL;
    return (list);
} 

LinkedListNode *LinkedListDataAdd(LinkedList *list, int x)/* 追加 */
{
    LinkedListNode *ptr; /* 注目するノードへのポインタ */
    LinkedListNode *prev; 
    LinkedListNode *new_node;

    ptr = list->head;
    prev = NULL;

    while (ptr) { /* 終端ノードに到達するまでループ */
	if (ptr->data < x) {
	    prev = ptr; /* 直前ノードの更新 */
	    ptr = ptr->next; /* 注目ノードの更新 */
	} else if (ptr->data == x) { /* x は登録済み */
	    return (NULL);
	} else { /* x を注目ノードの直前に追加 */
	    new_node = LinkedListNodeAlloc();
	    if (new_node == NULL) { /* 領域確保失敗 */
		exit (0); /* 終了 */
	    }
	    new_node->data = x;
	    new_node->next = ptr; /* ポインタの付け替え(注目ノードの直前) */
	    if (prev != NULL) { /* 連結リストの先頭以降に追加 */
		prev->next = new_node; /* ポインタの付け替え */
	    } else { /* 連結リストの先頭に追加 */
		list->head = new_node;
	    }
	    list->node_num++; /* ノード総数の更新 */
	    return (new_node);
	}
    }
    /* 終端ノードに到達 */
    /* x を終端に追加 */
    new_node = LinkedListNodeAlloc();
    if (new_node == NULL) { /* 領域確保失敗 */
	exit (0); /* 終了 */
    }
    new_node->data = x;
    new_node->next = NULL; /* new_node は新たな終端ノード */
    if (prev != NULL) { /* list は少なくともひとつのノードを有している */
	prev->next = new_node; /* 更新前の終端ノードの直後が new_node となる */
    } else { /* list は空(ノードがひとつも含まれない) */
	list->head = new_node;
    }
    list->node_num++; /* ノード総数の更新 */
    return (new_node);
}


LinkedList *LinkedListMake(char *filename)/* 連結リスト作成 */
{  
    FILE *fp;
    LinkedList *list;
    char buffer[MAXBUFFERSIZE];

    /* ファイル有無のチェック */
    if ((fp = fopen(filename, "r")) == NULL) {
	fprintf(stderr, "No Such File : %s\n", filename);
	exit (1);
    }

    list = LinkedListAlloc();
    if (list == NULL) { /* 領域確保失敗 */
	exit (0); /* 終了 */
    }

    while (fgets(buffer, MAXBUFFERSIZE, fp)) { /* ファイル終端に到達するまでループ */
	buffer[strlen(buffer) - 1] = '\0'; /* 改行文字を削除 */
	LinkedListDataAdd(list, atoi(buffer));
    }
    fclose(fp);

    return (list);
}


LinkedListNode *LinkedListSearch(LinkedList *list, int x)/* 探索 */
{
      
    LinkedListNode *pNode;
  
     for(pNode=list->head; pNode!=NULL; pNode=pNode->next)
     {
       if(pNode->data == x )
	 return (pNode);
     }

     return (NULL);
}

void LinkedListFree(LinkedList *list)/* 領域開放 */
{
    LinkedListNode *ptr; /* 注目ノードへのポインタ */
    LinkedListNode *rem; /* 削除ノード */

    ptr = list->head;

    while (ptr) { /* 終端ノードに到達するまでループ */
	rem = ptr;
	ptr = ptr->next;
	free(rem);
    }
    free(list);
}


int main(int argc, char *argv[])
{

  /*argv[1]はファイル名、argv[2]は探索する値*/
  struct LinkedList *list;

  int x;

  x = atoi(argv[2]);

  

  LinkedListMake(argv[1]);



  LinkedListFree(list);

  LinkedListSearch(list, x);

  return 0;

}

コンパイルは通ったのですがうまく動きません・・・
いろいろ調べてmain関数のLinkedListMake(argv[1]);の後にprintf("Read %d data\n", list->node_num);をいれてみたところ、node_numがマイナスの値になっていたので、それ以前がおかしいと思うのですが・・・
長いプログラムですが、どこがおかしいか指摘いただけないでしょうか?
お願いいたします。

アバター
a5ua
記事: 199
登録日時: 14年前

Re: 線形探索プログラム

#2

投稿記事 by a5ua » 14年前

ファイルから作ったリストを
list = LinkedListMake(argv[1]);
として、受け取る必要があると思います。

また、
LinkedListFree(list);
はLinkedListSearchの後で呼ばなければならないと思います。。

yuumaa

Re: 線形探索プログラム

#3

投稿記事 by yuumaa » 14年前

あ!
普通に値を返す関数なのを忘れてました・・・ありがとうございます。
malloc、free関数もう一度復習します。

閉鎖

“C言語何でも質問掲示板” へ戻る