[List]C语言实现链表
2015-07-11 00:18
417 查看
问题描述:数据结构中了解过链表,由一连串结点组成,有单向链表和双向链表之分。以下为单向链表一些知识的学习。
链表结点:单向链表每个节点包含一个节点数据项,一个指向下一节点的指针。最后一个节点因为没有下一个节点了,其指针为空指针,
struct node {
int value;
struct node *next;
};
struct node *first = NULL; // 初始化链表空
由于这里结构内有一个指向相同结构类型的指针成员,因此不能使用typedef的结构声明方式。
创建节点:首先要为节点分配内存单元,然后把数据存储到结点,最后把结点插入到链表。
struct node *new_node;
new_node = malloc(sizeof(struct node)); //为节点分配内存空间
由于new_node是一个指向结构的指针,对其赋值可以用间接寻址*,然后再用.操作符获取其中变量,另外也可以用->操作符直接操作,
(*new_node).value = 100;
或者
new_node->value = 100;
在链表头插入结点,
next_node->next = first;
first = new_node;
此时first为链表头,即第一个节点,其next指针指向节点自身。
搜索链表:for语句是首选,搜索链表惯用法:
for(p = first; p!=NULL; p = p->next)
……
删除结点:首先要定位要删除的结点,接着改变前一个结点,让其绕过删除结点,最后需调用free函数回收内存,
struct node *delete_from_list(struct node *list, int n){
struct node *cur,*prev;
for(cur=list,prev=NULL;cur!=NULL&&cur->value!=n;prev=cur,cur=cur->next)
;
if(cur==NULL) // 未找到元素
return list;
if(prev==NULL) // 元素在第一个结点
return list = list->next;
else
prev->next =cur->next;
free(cur);
return list;
}
有序链表:即链表中结点有序,按照结点中数据进行排序的。虽然有序链表的插入要麻烦一点,但是搜索会更快,不需要从头到尾的遍历。
链表结点:单向链表每个节点包含一个节点数据项,一个指向下一节点的指针。最后一个节点因为没有下一个节点了,其指针为空指针,
struct node {
int value;
struct node *next;
};
struct node *first = NULL; // 初始化链表空
由于这里结构内有一个指向相同结构类型的指针成员,因此不能使用typedef的结构声明方式。
创建节点:首先要为节点分配内存单元,然后把数据存储到结点,最后把结点插入到链表。
struct node *new_node;
new_node = malloc(sizeof(struct node)); //为节点分配内存空间
由于new_node是一个指向结构的指针,对其赋值可以用间接寻址*,然后再用.操作符获取其中变量,另外也可以用->操作符直接操作,
(*new_node).value = 100;
或者
new_node->value = 100;
在链表头插入结点,
next_node->next = first;
first = new_node;
此时first为链表头,即第一个节点,其next指针指向节点自身。
搜索链表:for语句是首选,搜索链表惯用法:
for(p = first; p!=NULL; p = p->next)
……
删除结点:首先要定位要删除的结点,接着改变前一个结点,让其绕过删除结点,最后需调用free函数回收内存,
struct node *delete_from_list(struct node *list, int n){
struct node *cur,*prev;
for(cur=list,prev=NULL;cur!=NULL&&cur->value!=n;prev=cur,cur=cur->next)
;
if(cur==NULL) // 未找到元素
return list;
if(prev==NULL) // 元素在第一个结点
return list = list->next;
else
prev->next =cur->next;
free(cur);
return list;
}
有序链表:即链表中结点有序,按照结点中数据进行排序的。虽然有序链表的插入要麻烦一点,但是搜索会更快,不需要从头到尾的遍历。
相关文章推荐
- [Memory]C语言中的内存分配
- [enum]C语言中的枚举
- [PreProccess]C语言中预处理指令的使用
- [string]C语言中字符串使用需注意的地方
- [FileIO]C语言中流与文件操作编程学习
- [Union]C语言编程中联合Union的学习
- [SwitchCase]C语言编程switch case的使用
- [struct]C语言编程结构体的学习
- [Embedded_SW_模块化]嵌入式C语言工程文件组织_保持更新
- C语言 @property和@synthesize搭配使用声明和实现getter和setter方法
- C语言 点语法的总结
- C++之IO格式控制
- C++之IO格式控制
- chunkAnalyse:C++下读取指定文件下的指定文件或文件
- C语言 宏的概念和使用总结
- java的引用和C++的指针有什么区别
- C/C++ 基本类型数据的数值范围
- 编程思想之多线程与多进程(4)——C++中的多线程
- c语言推断数是否是素数
- C++运算符重载(友元函数方式)