数据结构之单链表
来源:互联网 发布:金山软件占市场 编辑:程序博客网 时间:2024/06/14 20:38
单向链表,大致操作有插入,删除,遍历,查找,销毁,它存取方便,只要修改节点的指针域即可。只是查找时,每次都需要从第一个开始遍历查找。
第一个节点只有直接后继,最后一个节点只有直接前驱。
对于插入操作,有头插法,尾插法,任意插,这些我们在实际运用中都要考虑到。它的一优势就是节省空间,灵活。而顺序表就容易造成空间的浪费。插入删除操作还会造成大量数据的移动。
单链表其实我认为是一种更为实用的数据类型,它将各种类型封装起来,来解决生活工作中遇到的实际问题。
下面开始实战:
/* list.h 头文件的定义 */
#ifndef _LIST_H_#define _LIST_H_#include <assert.h>typedef struct node{ int data; struct node *next;}node_t;node_t *list_insert_fornt(node_t *head,int data);typedef void (*FUNC)(node_t *);void list_for_each(node_t *head,FUNC f);node_t *list_get_node(node_t *head,int index);node_t *list_insert_at(node_t *head,int data,int index);node_t *list_remove_at(node_t *head,int index);node_t *list_find(node_t *head,int data,int *ret);node_t *list_free(node_t *head,int data);#endif /* _LIST_H_ */
/* list.c 接口的实现 */
#include "list.h"#include <stdio.h>node_t *list_insert_fornt(node_t *head,int data){ node_t *n = (node_t *)malloc(sizeof(node_t)); assert(n != NULL); n->data = data; n->next = NULL; if(head == NULL) head = n; else { n->next = head; head = n; } return head;}
void *list_for_each(node_t *head,FUNC f){ while(head) { f(head); head = head->next; }}node_t *list_get_node(node_t *head,int index){ int j = 0; while(head && j < index) { head = head->next; j++; } if(j == index)
<span style="white-space:pre"></span>return head; return NULL; //return head;}node_t *list_insert_at(node_t *head,int data,int index){ if(index == 0) return list_insert_front(head,data); node_t *n = (node_t *)malloc(sizeof(node_t)); assert(n != NULL); n->data = data; n->next = NULL; node_t *p = NULL; p = list_get_node(head,index - 1); if(p != NULL) { n->next = p-next; p->next = n; } else printf("insert error.\n"); return head;}node_t *list_remove_at(node_t *head,int index){ assert(index >= 0); if(index == 0) { n = head; free(n); head = head->next; } node_t *p = NULL; p = list_get_node(head,index -1); if(p == NULL || p->next == NULL) { fprintf(stderr,"remove error.\n"); exit(EXIT_FAILURE); } n = p->next; p->next = n->next; return head;}node_t *list_find(node_t *head,int data,int *ret){ *ret = -1; int i = 0; while(head) { if(data == head->data) { *ret = i; break; } head = head->next; i++; } return head;}node_t *list_free(head,data){ node_t *tmp = head; while(head) { head =head->next; free(tmp); tmp = head; } return head;}
/* main.c 测试代码 */
#include "list.h"#include <stdio.h>void print_node(node_t *n){ printf("data = %d \n",n->data);}int main(void){ node_t *head = NULL; head = list_insert_fornt(head,30); head = list_inset_fornt(head,20); head = list_insert_fornt(head,10); list_for_each(head,print_node); putchar('\n'); node_t *n = NULL; n = list_get_node(head,1); if(n != NULL) printf("data = %d\n",n->data); else printf("not find node.\n"); head = list_insert_at(head,15,1); list_for_each(head,print_node); putchar('\n'); head = list_remove_at(head,2); list_for_each(head,print_node); putchar('\n'); node_t *n = NULL; int ret = 0; n = list_find(head,20,&ret); if(n != NULL) printf("data = %d index = %d \n",n->data,ret); else printf("not find.\n"); head =list_free(head,data); assert(head == NULL); return 0;}
以下是运行示例:分别是插入,查找,任意插入,删除节点,找出节点,最后销毁链表。
(finish)
0 0
- 数据结构学习之单链表
- java数据结构之单链表
- 数据结构之单链表
- 数据结构学习之单链表
- 数据结构之单链表反转
- 数据结构之单链表
- 数据结构之, 单链表
- 数据结构之单链表
- 数据结构之单链表
- C++数据结构之单链表
- C++数据结构之单链表
- 数据结构之单链表
- 数据结构之单链表
- 大话数据结构之单链表
- C数据结构之单链表
- 数据结构基础之单链表
- javascript 数据结构 之 单链表
- 数据结构之单链表操作
- java 内存泄露原因
- APUE--sigaction函数的使用
- awk读输入(getline)
- ios 控制button点击事件的触发频率
- mysql中的字符匹配查询
- 数据结构之单链表
- hdoj 1285 确定比赛名次 【拓扑排序 注意重边】
- 图的邻接表表示、广度优先、深度优先搜索
- "ORA-00942: 表或视图不存在 "的原因和解决方法
- Android数据库更新并保留原来数据的实现
- 软件架构设计(一)
- struts2基础知识1
- C语言中可变参数的用法
- JOB JOB JOB——优先队列 + 贪心