LinkedListにchar*を追加して、linkedListが常にアルファベット順にソートされるようにするメソッドを作成しようとしています。LinkedItem構造体を定義するコードが与えられました:
// Define our list item as 'struct ListItem', and also
// typedef it under the same name.
typedef struct ListItem {
char *s;
struct ListItem *p_next;
} ListItem;
リストの先頭にアイテムを追加する方法もあります。
// Adds a new item to the beginning of a list, returning the new
// item (ie the head of the new list *)
ListItem* add_item(ListItem *p_head, char *s) {
// Allocate some memory for the size of our structure.
ListItem *p_new_item = malloc(sizeof(ListItem));
p_new_item->p_next = p_head; // We are the new tail.
p_new_item->s = s; // Set data pointer.
return p_new_item;
}
これが私のコードです。後で詳しく説明します。
ListItem* addSortedItem(ListItem *p_head, char *s){
if(p_head==NULL)//if the list is empty, we add to the beginning
return add_item(p_head,s);
ListItem* p_new_item = malloc(sizeof(ListItem));
ListItem *p_current_item = p_head; //makes a pointer to the head of the list
while (p_current_item) { // Loop while the current pointer is not NULL
printf("entering while loop with current=%s\n",p_current_item->s);
// now we want to look at the value contained and compare it to the value input
if(aThenB(s,p_current_item->s)!=TRUE){
// if A goes after B, we want to go on to look at the next element
p_current_item=p_current_item->p_next;
} else if (aThenB(s,p_current_item->s)==TRUE) {printf("entered elseif\n");
p_head=add_item(p_current_item,s);
return p_head;
} else {printf("WHY DID WE EVER REACH THE ELSE!?"); return p_head;}
}
}
ここで、aThenB(StringA、StringB)は、AとBの正しい並べ替え順序がA、次にBの場合はTRUEを返し、それ以外の場合はfalseを返します。 -)
私のテストデータ(つまり"sheep i"
、0から10までのi)で起こっていることは、順序の入力に応じて、1つの要素のみを返すか、要素をランダムにスキップすることです。より多くのコードを含めることができますが、少し面倒です。
私の問題は、ポインタとその動作を完全に理解していないことに起因していると思います。p_currentがリストを移動している間、p_headが常にヘッドを指していることを確認したいと思います。しかし、p_currentが最後の要素に到達すると、セグメンテーション違反も発生するため、どこが間違っているのかわかりません。
私のコードを正しく返す方法について助けてくれてありがとう:-)
編集:addSortedItem()は、メインメソッドの次のブロックで呼び出されます。
// The empty list is represented by a pointer to NULL.
ListItem *p_head = NULL;
ListItem *p_head2=NULL;
// Now add some items onto the beginning of the list.
int i;
for (i=0; i<NO_ITEMS; i++) {
// Allocate some memory for our string, and use snprintf to
// create a formatted string (see GNU API docs) much like printf
// but instead writing to memory rather than the screen.
char* s = malloc(MAX_DATA_CHARS);
snprintf(s, (size_t) MAX_DATA_CHARS, "sheep %d", i);
p_head = addSortedItem(p_head, s);
}