二哥学算法之单向链表
来源:互联网 发布:匡恩网络最新动态 编辑:程序博客网 时间:2024/06/02 04:50
先扯一点淡。我也正在学数据结构和算法,而且基本还是入门水平。所以代码水平肯定很低。如发现问题,欢迎反馈。如果你是和我一样的菜鸟,咱们共同进步;如果你是大神,欢迎指点。
PS:二哥是我的外号
正式开始:
链表是比较常见而且入门级的数据结构,比较简单的线性结构。物理上不连续(因为地址一般 是动态内存随机分配的),逻辑上连续。下面画一下链表的逻辑结构。
上图就是链表的逻辑模型。显而易见可以用一个结构体来实现。每一个结构体包含两个元素:数据和指向下一个节点的指针。当指向NULL时就代表达到了链表的末端。通过这种设计,我们就能从链表头开始进行数据的遍历。而且能做到读取数量不定的数据,这是数据所不具有的优点。
设计思路:
既然要能连续的存储数据,参见上图。所以至少需要两个指针。一个指向前一个结构,一个指向当前的结构。即
previous->next=current;
这样能使每一个数据都连续存储起来。
同时也不要忘了每次都把当前结构中的next为NULL(链表结束的标志)即:
current->next=NULL;
previous=current;
下面贴一下自己写的代码,
声明:我所写的代码借鉴了feixiaoxing先生所写的,我也正在看他的博客来一步一步学习。在此向feixiaoxing先生致谢。feixiaoxing先生博客地址:http://blog.csdn.net/feixiaoxing/article/details/6835423
搭建主函数和头文件
#include <stdio.h>#include <stdlib.h>#include <ctype.h>typedef struct list pList; //创建结构体 struct list{int data;struct list* next;};int main(void){pList** ppList=NULL;pList* pList=NULL;ppList=&pList;int number;char letter='0';do{printf("Enter a number: ");scanf("%d",&number);getchar(); //吸收字符 add_data(number,ppList);printf("Do you want to enter another number?(Y or N)");scanf("%c",&letter);}while(tolower(letter)!='n');print_list(ppList);return 0;}接下来呢,编写一个创建链表的子函数
list* create_list(int value,list* pList){pList=(list*)malloc(sizeof(list));pList->data=value;pList->next=NULL;return pList;}
然后呢,我们要能向链表中插入数据。这也是最关键的部分。在这里打印数据,插入数据,都是通过递归实现的。
插入数据:
void _add_data(list** ppList,list* pList){if(*ppList==NULL){ //first one *ppList=pList; return; }_add_data(&(*ppList)->next,pList);}void add_data(int value,list** ppList){if(ppList==NULL) return;list* pList=NULL;pList=create_list(value,pList);if(pList==NULL) return;_add_data(ppList,pList);}打印数据:之前我们提到过,找到NULL就达到了链表的末端。此时应立即返回。
void print_list(list** ppList){ //打印链表 if(*ppList==NULL) return;printf("%d\n",(*ppList)->data);print_list(&(*ppList)->next);}以上就是全部代码。我在Devc++下面是完全调得通的。可能在某些编译器下不能顺利通过。如有此类问题请告诉我,共同进步。
代码大概就是这些。我这里只是起了头。对于链表的删除操作,统计操作等都没有设计。抛土引玉。
0 0
- 二哥学算法之单向链表
- 二哥学算法之链表逆转
- 二哥学算法之排序
- 二哥学算法之图(开篇)
- 重学算法之路---1001. 二哥摘苹果
- 二哥学算法之快速排序和堆排序
- 二哥学算法之归并排序和希尔排序
- 重新教自己学算法之单向链表(九)
- 静下心来写算法(之单向链表)
- 单向链表算法
- 算法之路之征服上海交大的oj- 二哥炒股票
- 一步一步写算法(之单向链表)
- 一步一步写算法(之循环单向链表)
- 一步一步写算法(之单向链表)
- 一步一步写算法(之单向链表)
- 一步一步写算法(之循环单向链表)
- 一步一步写算法(之单向链表)
- 一步一步写算法(之单向链表)
- SOA概述
- 虚拟机克隆后eth0网卡变成eth1网卡并且IP地址消失问题解决
- 重载和重写
- JavaWeb 通过配置切换底层存储源
- FTP服务器配置(cmd中ftp命令)
- 二哥学算法之单向链表
- 自学安卓的一些烦恼
- 2014ACM/ICPC亚洲区北京站现场赛(HDU 5111,5115,5119,5120,5122)
- 第13周项目5(1)统计字母‘A’的出现次数
- 函数,结构体,折半查找
- UVA 10066 10192
- 组合数学中那些有趣的球和盒子的问题(超强闷骚版,再也不怕球球了)
- GitHub详细教程
- EventBus初次使用