[英]Sorted Linked list not working properly in C
對 C 完全陌生,我試圖在 C 中創建一個鏈表,按字母順序對預先存在的字符數組進行排序。 每個字符都分配了一個索引。 所以listInsert函數應該將每個字符串插入到鏈表中,並按字母順序排序,這樣在調用listPrintForward時,鏈表中的項就會按字母順序打印。
這是我運行程序時的當前輸出。
INSERT:
bravo oscar romeo delta whisky alpha
foxtro sierra yankee lima echo
golf november victor charlie mike
zulu tango kilo quebec hotel
juliet xray papa uniform india
FORWARD: 0 entries
india uniform papa xray juliet hotel
quebec kilo tango zulu mike
charlie victor november golf echo
lima yankee sierra foxtrot alpha
whisky delta romeo oscar bravo
正如你所看到的,我的 listInsert 函數當前所做的就是將它們插入到一個鏈表中(我認為),當調用 printForward 函數時,它會反轉鏈表的內容,當它應該按字母順序打印鏈表的內容時命令。
我想要發生的輸出應該是:
INSERT:
bravo oscar romeo delta whisky alpha
foxtro sierra yankee lima echo
golf november victor charlie mike
zulu tango kilo quebec hotel
juliet xray papa uniform india
FORWARD: 0 entries
alpha bravo charlie delta echo foxtrot
golf hotel india juliet kilo
lima mike november oscar papa
quebec romeo sierra tango uniform
victor whisky xray yankee zulu
有誰知道如何解決這個問題或我做錯了什么? 這是完整的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SUCCESS 0
#define FAIL 1
char *phonetic[] = { "alpha", "bravo", "charlie", "delta", "echo", "foxtrot",
"golf", "hotel", "india", "juliet", "kilo", "lima", "mike",
"november", "oscar", "papa", "quebec", "romeo", "sierra",
"tango", "uniform", "victor", "whisky", "xray", "yankee",
"zulu" };
unsigned char indexes[] = { 1, 14, 17, 3, 22, 0, 5, 18, 24, 11, 4, 6, 13, 21,
2, 12, 25, 19, 10, 16, 7, 9, 23, 15, 20, 8 };
// represents an entry in the linked-list
struct listEntry
{
char *data_p; // pointer to the entry's string
struct listEntry *prev_p; // pointer to previous entry in the linked-list
struct listEntry *next_p; // pointer to next entry in the linked-list
};
// represents the linked-list
struct list
{
int entryCount; // number of entries present in the linked-list
struct listEntry *head_p; // pointer to the first entry in the list
struct listEntry *tail_p; // pointer to the last entry in the list
};
// Dynamically allocate & initialise an empty linked list
int listCreate(struct list** list_p2)
{
// allocate struct list from heap
*list_p2 = (struct list*) malloc(sizeof(**list_p2));
if (*list_p2 != NULL)
{
// zero-initialize the list structure
memset(*list_p2, 0, sizeof(**list_p2));
return SUCCESS;
}
return FAIL;
}
// Free all entries in the linked-list and the list structure
int listDestroy(struct list *list_p)
{
if (list_p != NULL)
{
struct listEntry *entry_p = list_p->head_p;
while (entry_p != NULL)
{
struct listEntry *next_p = entry_p->next_p;
// free the current entry
free(entry_p);
// move to the next entry
entry_p = next_p;
}
// free list structure
free(list_p);
}
return FAIL;
}
// Traverse the linked-list from head to tail printing out
// the string data from each list entry
int listPrintForward(struct list *list_p)
{
if (list_p)
{
struct listEntry *entry_p = list_p->head_p;
int count = 0;
printf("FORWARD: %d entries\n", list_p->entryCount);
while (entry_p != NULL)
{
if ((count > 0) && (count % 5 == 0))
{
printf("%s\n", entry_p->data_p);
}
else
{
printf("%s ", entry_p->data_p);
}
if (entry_p == list_p->tail_p)
printf("\n");
entry_p = entry_p->next_p;
fflush(stdout);
count++;
}
return SUCCESS;
}
return FAIL;
}
// Traverse the linked-list from tail to head printing out
// the string data from each list entry
int listPrintReverse(struct list *list_p)
{
if (list_p)
{
struct listEntry *entry_p = list_p->tail_p;
int count = 0;
printf("REVERSE: %d entries\n", list_p->entryCount);
while (entry_p != NULL)
{
if ((count > 0) && (count % 5 == 0))
{
printf("%s\n", entry_p->data_p);
}
else
{
printf("%s ", entry_p->data_p);
}
if (entry_p == list_p->head_p)
printf("\n");
entry_p = entry_p->prev_p;
fflush(stdout);
count++;
}
return SUCCESS;
}
return FAIL;
}
// Insert the given string into the linked-list such that the
// entries in the linked-list are in alphabetical order
int listInsert(struct list *list_p, char *string_p)
{
struct listEntry *temp;
temp=(struct listEntry *)malloc(sizeof(struct listEntry));
temp->data_p = string_p;
if (list_p->head_p == NULL)
{
//List is Empty
list_p->head_p = temp;
temp->next_p = NULL;
}
else
{
temp->next_p =list_p->head_p;
list_p->head_p = temp;
}
return FAIL;
}
int main(int argc, char **argv)
{
struct list *list_p = NULL;
(void) argc;
(void) argv;
if (listCreate(&list_p) == SUCCESS)
{
unsigned int count;
// insert every word in the phonetic alphabet into the
// linked-list.
printf("INSERT:\n");
for (count = 0; count < sizeof(indexes); count++)
{
if ((count > 0) && (count % 5 == 0))
{
printf("%s\n", phonetic[indexes[count]]);
}
else
{
printf("%s ", phonetic[indexes[count]]);
}
listInsert(list_p, phonetic[indexes[count]]);
}
printf("\n");
// print out the list in alphabetical order
listPrintForward(list_p);
// print out the list in reverse alphabetical order
listPrintReverse(list_p);
// Destroy the linked list and free all associated memory
listDestroy(list_p);
}
return SUCCESS;
}
您正在按索引順序插入條目。 您應該在 temp->p_data 上執行 strcmp 並從頭到尾遍歷列表並插入節點。
見http://analgorithmaday.blogspot.nl/2011/01/insertion-sort-using-linked-list.html
提示
問候
約翰
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.