長くてすみません・・・
#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がマイナスの値になっていたので、それ以前がおかしいと思うのですが・・・
長いプログラムですが、どこがおかしいか指摘いただけないでしょうか?
お願いいたします。