思想很简单,不再赘述,实现见代码:
#include <iostream>
typedef struct node
{
int data;
struct node *next;
} NODE;
NODE *create_end(int arr[], int len)
{
NODE *head = (NODE *)malloc(sizeof(NODE *));
head->next = NULL;
NODE *end = head;
for (int i = 0; i < len; i++) {
NODE *p = (NODE *)malloc(sizeof(NODE *)); // 也可用 new NODE();
p->data = arr[i];
end->next = p;
end = p;
}
end->next = NULL;
return head;
}
// 此方法适用于不带头节点的单链表的打印,对于带头节点的单链表要稍作处理。
void print(NODE *head)
{
if (head == NULL) return;
while (head != NULL) {
printf("%d\n",head->data);
head = head->next;
}
}
// 单链表排序(采用-冒泡排序法)(适用于-不带头节点的单链表)
// 对于带头节点的单链表来说,在传参时,要稍作调整。
void sortList(NODE *head)
{
NODE *p = head;
NODE *q = head;
int temp;
for (; p->next; p = p->next) { // 确定比较次数
for (q = head; q->next; q = q->next) {
if (q->data > q->next->data) {
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
}
}
}
int main(int argc, const char * argv[]) {
int arr[] = {6,2,5,4,3,7,1};
int len = sizeof(arr)/sizeof(int);
NODE *head = create_end(arr, len);
// 因为创建的链表是带头节点的,所以此处打印要稍作处理;
NODE *first = head->next;
print(first);
printf("----------------------\n");
NODE *first_2 = head->next;
sortList(first_2);
print(head->next);
return 0;
}