C語言:用單鏈表實現輸入排序
阿新 • • 發佈:2019-01-05
純當練習
連結串列頭結點儲存的資訊是連結串列長度
平臺VS2015
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
struct ListNode {
int val;
struct ListNode *next;
};
void createList(struct ListNode* list, int listsSize) {
struct ListNode *listHead = list; //指向頭結點的頭指標
struct ListNode * tail = listHead->next; //指向最後一個元素的尾指標
struct ListNode *p; //在頭指標和尾指標之間活動的指標
struct ListNode *body; //用於建立新的節點
int i = 0;
if (listsSize <= 0)
return;
srand(time(NULL)); //用於建立隨機數,我用隨機數模擬了輸入(懶),見21行和28行
puts("input:data");
body = (struct ListNode * )malloc(sizeof(struct ListNode));
body->next = NULL;
body->val = rand() % 10;
body->next = listHead->next;
listHead->next = body;
tail = body;
while (i<listsSize-1)
{
body = (struct ListNode *)malloc(sizeof(struct ListNode));
body->next = NULL;
body->val = rand() % 10;
if (body->val <= listHead->next->val)
{//如果資料小於第一個節點的資料(也就是頭指標的下一個節點),
//就插在頭指標及其後一個節點之間
body->next = listHead->next;
listHead->next = body;
}
else if (body->val > tail->val)
{//資料大於尾指標,則放到連結串列最後
tail->next = body;
tail = tail->next;
}
else
{//在第一個節點和最後一個節點範圍之間,則尋找合適的大小位置
p = listHead->next;
while (body->val > p->next->val&&p != tail)
{
p = p->next;
}
body->next = p->next;
p->next = body;
}
i++;
}
list->val = listsSize;
}
void DisplayList(struct ListNode *list)
{
struct ListNode *p = list->next;
int i = 0;
while (i < list->val-1)
{
printf("%d->", p->val);
p = p->next;
i++;
}
printf("%d", p->val);
}
void DestroyList(struct ListNode *list)
{
struct ListNode *p = list->next;
while (p!= NULL)
{
free(list);
list = p;
p = p->next;
}
free(list);
}
int main()
{
struct ListNode *list = (struct ListNode *)malloc(sizeof(struct ListNode));
//預設建立連結串列長度為5
createList(list, 5);
//列印連結串列
DisplayList(list);
DestroyList(list);
system("pause");
return 0;
}