单向链表--初始化、添加删除节点、排序链表
2012-10-25 10:02
302 查看
对单向链表的初始化、插入/删除节点、打印链表、对链表排序等一系列简单的操作:
#include<stdio.h> #include<stdlib.h> #define MAXBUF 1024 typedef struct LINK_LIST{ int data; struct LINK_LIST *next; }LINK_LIST; LINK_LIST *get_node(LINK_LIST *head, int i); int init_list(LINK_LIST *list) { list->data = 0; list->next = NULL; return 0; } void destroy_list(LINK_LIST *head) { LINK_LIST *tmp_list; while(head != NULL) { tmp_list = head->next; free(head); head = tmp_list; } } void clear_list(LINK_LIST *head) { LINK_LIST *tmp_list = head; while(tmp_list != NULL) { tmp_list->data = 0; tmp_list = head->next; } } void print_list(LINK_LIST *head) { LINK_LIST *tmp_list = head; int i = 0; while(tmp_list != NULL) { printf("%3d ", tmp_list->data); tmp_list = tmp_list->next; if ((++i) % 10 == 0) { printf("\n"); } } } int list_length(LINK_LIST *head) { int length = 0; LINK_LIST *p = head; while(p != NULL) { length++; p = p->next; } return length; } int get_elem(LINK_LIST *head, int i, int *e) { int n = i; LINK_LIST *p; p = get_node(head, i); *e = p->data; return *e; } int locate_elem(LINK_LIST *head, int e, char compare) { int i = 0; LINK_LIST *p = head; switch(compare) { case '>': while(p != NULL) { if (e > p->data) { return i; } p = p->next; i++; } return -1; break; case '=': while(p != NULL) { if (e == p->data) { return i; } p = p->next; i++; } return -1; break; case '<': while(p != NULL) { if (e < p->data) { return i; } p = p->next; i++; } return -1; break; default: return -1; } } LINK_LIST *get_node(LINK_LIST *head, int i) { int n = 0; LINK_LIST *p = head; while((++n <= i) && p != NULL) { p = p->next; } return p; } int list_insert(LINK_LIST *head, int i, int e) { LINK_LIST *p, *insert; insert = malloc(sizeof(LINK_LIST)); if (insert == NULL) { return -1; } insert->data = e; insert->next = NULL; p = get_node(head, i); if (p == NULL) { return -1; } insert->next = p->next; p->next = insert; return 0; } int list_delete(LINK_LIST *head, int i, int *e) { LINK_LIST *p,*delete; if (i > 0) { p = get_node(head, i-1); delete = p->next; p->next = delete->next; free(delete); } else if (i == 0) { p = head->next; free(head); head = p; } return 0; } int list_sort_inc(LINK_LIST *head) { int i, j, length; int tmp, min; LINK_LIST *prev, *next; length = list_length(head); for(i = 0; i < length - 1; i++) { min = i; for(j = i + 1; j < length; j++) { prev = get_node(head, min); next = get_node(head, j); if (next->data < prev->data) { min = j; } } prev = get_node(head, min); next = get_node(head, i); tmp = next->data; next->data = prev->data; prev->data = tmp; } } int main(void) { LINK_LIST *list_a, *list_b; int length_a, length_b; int i, n, e = 0; list_a = malloc(sizeof(LINK_LIST)); list_b = malloc(sizeof(LINK_LIST)); if (list_a == NULL || list_b == NULL) { return -1; } init_list(list_a); init_list(list_b); for(i = 0; i < 20; i++) { list_insert(list_b, i, 20-i); list_insert(list_a, i, 20-i); } list_sort_inc(list_a); list_sort_inc(list_b); length_a = list_length(list_a); length_b = list_length(list_b); for(i = 0; i < length_b; i++) { get_elem(list_b, i, &e); if ((n = locate_elem(list_a, e, '=')) != -1) { list_insert(list_a, n, e); } } list_sort_inc(list_a); print_list(list_a); destroy_list(list_a); destroy_list(list_b); return 0; }
相关文章推荐
- 单向链表小练习--》创建链表头,添加删除链表节点,释放链表内存,选择插入数据
- 单链表创建,删除节点,添加节点,排序
- 双向链表的初始化,建立,添加节点和删除节点(注意插入和删除要分三种情况)
- 合并两个排序的链表及简单链表的一些操作(添加节点、删除节点)
- 删除单向链表的部分节点
- 单向链表的创建、节点删除、链表输出、翻转(写法参考计蒜客数据结构课程)
- 链表排序、链表删除、访问倒数第k个节点
- [算法练习]逆置链表,链表排序,删除节点
- 单向链表的相关操作总结:创建、删除、查找、排序、统计链表大小、链表的反转和遍历等
- 删除单向链表中的某一个节点
- 1.01一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
- 单向链表在O(1)时间内删除一个节点
- 华为OJ(从单向链表中删除指定值的节点)
- 单向链表(二) 删除指定位置的节点
- 基于Python单向循环链表实现尾部、任意位置添加,删除
- O(1)时间内删除单向链表中的一个节点
- 链表排序、链表删除、访问倒数第k个节点
- 从单向链表中删除指定值的节点
- CCI 2.3 删除单向链表中的某个节点,假设只能访问该节点
- 基于Python单向链表实现尾部、任意位置添加,删除