[I0A]链表-单链表
2016-02-24 14:54
316 查看
链表,分为单链表,双链表,循环链表。只要掌握基本的单链表后面两种非常轻松就可以解决。
什么是单链表?
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
┌───┬───┐ ┌───┬───┐ ┌───┬───┐
│data │next │---> │data │next │--->│data │next │
└───┴───┘ └───┴───┘ └───┴───┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
这是一个包含单链表的基本定义。
单链表的创建:
这是一个包含空头结点的单链表,之所以包含空头结点 是为了简化操作。
主要讲解,单链表的删除和插入过程,因为该两种过程是所有操作的基础。
删除:
![](http://img.blog.csdn.net/20160224144729513?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
插入:
![](http://img.blog.csdn.net/20160224145330827?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
什么是单链表?
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
┌───┬───┐ ┌───┬───┐ ┌───┬───┐
│data │next │---> │data │next │--->│data │next │
└───┴───┘ └───┴───┘ └───┴───┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
typedef struct node node; struct node{ int element; node* next; }; typedef struct { node *head; int size; }linked_list;
这是一个包含单链表的基本定义。
单链表的创建:
linked_list create_list(){ node* n = create_node(INT_MIN); linked_list list = {n,0}; return list; } node* create_node(int element){ node* n = malloc(sizeof(node)); n->element = element; n->next = NULL; return n; }
这是一个包含空头结点的单链表,之所以包含空头结点 是为了简化操作。
主要讲解,单链表的删除和插入过程,因为该两种过程是所有操作的基础。
删除:
插入:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef struct node node; struct node{ int element; node* next; }; typedef struct { node *head; int size; }linked_list;
node*
create_node(int element);
linked_list
create_list();
void
append(linked_list* list,int element);
node*
search(linked_list list,int element);
void
sort(linked_list* list);
void
print_list(linked_list list);
void
menu();
void
list_test();
void
clear_list(linked_list* list);
void
delete(linked_list* list,int element);
node*
find_less_than(linked_list list,int element);
int main(int argc,char** argv){
list_test();
return 0;
}
void delete(linked_list* list,int element){
node *ptr = search(*list,element);
//node *ptr = list->head;
//while(ptr->next && ptr->next->element != element) ptr = ptr->next;
if(ptr->next){
node* tmp = ptr->next;
ptr->next = ptr->next->next;
free(tmp);
list->size--;
}
}
void clear_list(linked_list* list){
node *n = list->head;
while(n){
list->head = n->next;
free(n);
n = list->head;
}
}
void list_test(){
linked_list list = create_list();
int element,choice;
while(1){
menu();
print_list(list);
printf("input choice:");
scanf("%d",&choice);
switch(choice) {
case 1:{printf("input number:");scanf("%d",&element);append(&list,element);break;}
case 2:{printf("input number:");scanf("%d",&element);node *n = search(list,element);if(n->next) printf("element exists\n");break;}
case 3:{sort(&list);break;}
case 4:{printf("input number:");scanf("%d",&element);delete(&list,element);break;}
case 5:{clear_list(&list);exit(0);}
default:break;
}
getchar();
}
}
node* find_less_than(linked_list list,int element){
node *ptr = list.head;
while(ptr->next && ptr->next->element < element) ptr = ptr->next;
return ptr;
}
void menu(){
system("clear");
printf("Linked List Test\n");
printf("1.append\n");
printf("2.search\n");
printf("3.sort\n");
printf("4.delete\n");
printf("5.exit\n");
}
void print_list(linked_list list){
node* n = list.head->next;
while(n){
printf("%d\t",n->element);
n = n->next;
}
printf("\n");
}
void sort(linked_list *list){
node *ptr = list->head->next;
list->head->next = NULL;
while(ptr){
node* n = ptr;
node *tmp = find_less_than(*list,n->element);
ptr = ptr->next;
n->next = tmp->next;
tmp->next = n;
}
}
node* search(linked_list list,int element){
node *ptr = list.head;
while(ptr->next && ptr->next->element != element) ptr = ptr->next;
return ptr;
}
void append(linked_list* list,int element){
node *ptr = list->head;
while(ptr->next!=NULL) ptr = ptr->next;
ptr->next = create_node(element);
list->size++;
}
linked_list create_list(){ node* n = create_node(INT_MIN); linked_list list = {n,0}; return list; } node* create_node(int element){ node* n = malloc(sizeof(node)); n->element = element; n->next = NULL; return n; }
相关文章推荐
- 1.String、Stringbuffer、Stringbuilder之间的区别。
- Java 网络编程(三) 创建和使用URL访问网络上的资源
- re.sub使用[]进行多目标替换
- 该怎样裁切Zbrush中的物体
- iOS 应用件跳转到appstore相关界面
- Unable to resolve target 'android-14'
- 《大话数据结构》之堆排序
- 修改Xcode自动生成的文件注释来导出API文档
- 任务调度Quartz初探Demo(二)
- CentOS 关闭virbr0
- .NET深入解析LINQ框架2
- xenserver+starwind架构布署
- PHP PDO prepare()、execute()和bindParam()方法详解
- Java 网络编程(二) 两类传输协议:TCP UDP
- iis部署asp.net mvc网站出错的解决方法
- 用PL/SQL dev远程连接oracle数据库
- js 创建对象的几种方式
- joda.time 处理时间--计算2个日期之间的天数
- 0777前面的0原来是叫个suid和guid的东西
- [置顶] 获取android手机的屏幕分辨率 android开发