二哥学算法之单向链表

来源:互联网 发布:匡恩网络最新动态 编辑:程序博客网 时间: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