0
点赞
收藏
分享

微信扫一扫

和菜鸟一起学数据结构之简单单链表实现


       国庆已经结束一周了,工作也有一周了。迷迷糊糊,sdk和文档也写完了,bootloader中加上spi flash的读写功能也实现了。但是心里空空的,不知为什么,开心不起来。这周,让我明白了很多很多,自己的路还是依然选择继续走下去,不管怎样。总会好的,一切都会好的。

      

       以前一直都用现成的c++的STL来实现各种数据结构的,但是这样只会用,学不到数据结构的真谛。重新拿起严蔚敏老师的书,还是从最最简单的链表开始吧。

      



#include <stdio.h>

#include <stdlib.h>

#include <string.h>



typedef struct list

{

int data;

struct list *next;

}List;



List* list_create(void);

void list_insert(List *head, int value);

void list_delete(List *head, int value);

void list_destroy(List *head);

void list_order(List *head);

void list_print(List *head);



int main(void)

{

List *head;

int i;



head = list_create();



for(i = 1; i <= 5 ;i++)

list_insert(head, i);



list_print(head);

printf("\n");



list_order(head);



list_print(head);

printf("\n");



list_delete(head, 3);



list_print(head);

printf("\n");



list_destroy(head);



return 0;

}



/*

创建链表头。

*/

List* list_create(void)

{

List *head;

head = (List *)malloc(sizeof(List));

head->next = NULL;



return head;

}



/*

在链表尾部插入一个值为value的节点

*/

void list_insert(List *head, int value)

{

List *stu, *pos;

pos = head;



while(pos->next != NULL) pos = pos->next;



stu = (List *)malloc(sizeof(List));

stu->data = value;

stu->next = NULL;

pos->next = stu;

pos = pos->next;

}



/*

删除链表中值为value的节点

*/



void list_delete(List *head, int value)

{

List *pos1, *pos2;

int flag = 1;



pos1 = head;



while(pos1->next != NULL)

{

if(pos1->next->data == value)

{

pos2 = pos1->next;

pos1->next = pos2->next;

free(pos2);

flag = 0;

break;

}

pos1 = pos1->next;

}



if(flag)

{

printf("No emlement\n");

}



}



/*

打印整个链表的节点的值

*/

void list_print(List *head)

{

int i = 0;

List *pos;



pos = head;



if(pos->next == NULL)

{

printf("Empty list\n");

return;

}



while(pos->next != NULL)

{

pos = pos->next;

printf("%d ", pos->data);

}

printf("\n");

}



/*

释放链表

*/

void list_destroy(List *head)

{

List *pos1, *pos2;



pos1 = head;



if(pos1->next == NULL)

{

printf("Empty list\n");

return;

}



while(pos1->next != NULL)

{

pos2 = pos1;

pos1 = pos1->next;

free(pos2);

}



free(pos1);

}



/*

从大到小排序

*/

void list_order(List *head)

{

List *pos1, *pos;

List *tail1, *pri1, *mid1;

List *tail2, *pri2, *mid2;



pos = head;



if(pos->next == NULL)

{

printf("Empty list\n");

return;

}



while(pos->next != NULL)

{

pri1 = pos;

mid1 = pri1->next;

tail1 = mid1->next;



pos1 = pos;

while(pos1->next != NULL)

{

pri2 = pos1;

mid2 = pri2->next;

tail2 = mid2->next;



if(mid1->data < mid2->data)

{

mid1->data ^= mid2->data;

mid2->data ^= mid1->data;

mid1->data ^= mid2->data;

}

pos1 = pos1->next;

}

pos = pos->next;

}

}


     比较简单就不多做讲解了。

举报

相关推荐

0 条评论