您的位置:首页 > 编程语言 > C语言/C++

c语言之单链表的创建及排序

2015-09-05 17:18 609 查看
 今天对之前学习过的链表知识进行简单的总结顺便写点代码;创建一个链表有头插法跟尾插法两种,在下面代码中我们为结点分配的内存实在堆上分配的,因此需要我们手动释放,释放用free()函数

 下面代码贴出具体代码:

 

#include <stdio.h>
#include <stdlib.h>

struct person {
int age;
struct person *next;
};

struct person *insert_head(struct person *head, int age);
struct person *insert_tail(struct person *head, int age);
void destroy_list(struct person *head);
void show(struct person *head);

int main()
{
struct person *head = NULL;
head = insert_tail(head, 20);
head = insert_tail(head, 30);
head = insert_tail(head, 60);
head = insert_tail(head, 50);
head = insert_tail(head, 40);
show(head);

   return 0;
}

/*头插法*/
struct person *insert_head(struct person *head, int age)
{
struct person *tmp = NULL;

tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL;

if(NULL == head) {
return tmp;
}
tmp->next = head;
head = tmp;

return head;
}

/*尾插法*/
struct person *insert_tail(struct person *head, int age)
{
struct person *tmp = NULL;
struct person *find = NULL;

tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL;

if(NULL == head) {
return tmp;
}
find = head;
while(find->next) {
find = find->next;
}
find->next = tmp;

return head;
}

/*销毁整个链表*/
void destroy_list(struct person *head)
{
struct person *tmp = NULL;

tmp = head->next;
while(tmp) {
head->next = tmp->next;
free(tmp);
tmp = head->next;
}
}

/*遍历链表*/
void show(struct person *head)
{
struct person *tmp = head;
while(tmp) {
printf("aeg is %d\n", tmp->age);
tmp = tmp->next;
}
}


  上面的是创建了一个简单的链表,下面我们对链表进行简单的排序:

  对于下面的链表排序:我们可以分为三步:

  (1)在原链表中找到最小的

  (2)从原链表摘下最小的

  (3)一次插入到新链表

  循环直到原链表为空

#include <stdio.h>
#include <stdlib.h>

struct person {
int age;
struct person *next;
};

struct person *insert_head(struct person *head, int age);
struct person *insert_tail(struct person *head, int age);
struct person *insert_sort(struct person *head);
void destroy_list(struct person *head);
void show(struct person *head);

int main()
{
struct person *head = NULL;
head = insert_tail(head, 20);
head = insert_tail(head, 30);
head = insert_tail(head, 60);
head = insert_tail(head, 50);
head = insert_tail(head, 40);
show(head);
printf("------------------------------\n");
head = insert_sort(head);
show(head);
}

/*头插法*/
struct person *insert_head(struct person *head, int age)
{
struct person *tmp = NULL;

tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL;

if(NULL == head) {
return tmp;
}
tmp->next = head;
head = tmp;

return head;
}

/*尾插法*/
struct person *insert_tail(struct person *head, int age)
{
struct person *tmp = NULL;
struct person *find = NULL;

tmp = (struct person *)malloc(sizeof(struct person));
tmp->age = age;
tmp->next = NULL;

if(NULL == head) {
return tmp;
}
find = head;
while(find->next) {
find = find->next;
}
find->next = tmp;

return head;
}

/*销毁整个链表*/
void destroy_list(struct person *head)
{
struct person *tmp = NULL;

tmp = head->next;
while(tmp) {
head->next = tmp->next;
free(tmp);
tmp = head->next;
}
}

#if 0
/*从大到小*/
struct person *insert_sort(struct person *head)
{
struct person *tmp = NULL;
struct person *newhead = NULL;
struct person *min = NULL;
struct person *min_pre = NULL;

if(NULL == head || NULL == head->next)
return head;

while(head) {
tmp = head;
min = head;
min_pre = NULL;

/*step 1:find min*/
while(tmp->next) {
if(min->age > tmp->next->age) {
min_pre = tmp;
min = tmp->next;
}
tmp = tmp->next;
}

/*step 2: cut min*/
if(min == head) {
head = head->next;
min->next = NULL;
}
else {
min_pre->next = min->next;
min->next = NULL;
}

/*step 3: insert new list*/
if(NULL == newhead) {
newhead = min;
continue;
}
min->next = newhead;
newhead = min;
}

return newhead;
}

#else
/*从小到大*/
struct person *insert_sort(struct person *head)
{
struct person *tmp = NULL;
struct person *newhead = NULL;
struct person *newtail = NULL;
struct person *min = NULL;
struct person *min_pre = NULL;

if(NULL == head || NULL == head->next)
return head;

while(head) {
tmp = head;
min = head;
min_pre = NULL;

/*step 1: find min*/
while(tmp->next) {
if(min->age > tmp->next->age) {
min_pre = tmp;
min = tmp->next;
}
tmp = tmp->next;
}

/*step 2: cut min*/
if(min == head) {
head = head->next;
min->next = NULL;
}
else {
min_pre->next = min->next;
min->next = NULL;
}

/*step 3: insert new list*/
if(NULL == newhead) {
newhead = min;
newtail = min;
continue;
}
newtail->next = min;
newtail = newtail->next;
}

return newhead;
}
#endif

/*遍历链表*/
void show(struct person *head)
{
struct person *tmp = head;
while(tmp) {
printf("aeg is %d\n", tmp->age);
tmp = tmp->next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: