二哥学算法之单向链表

先扯一点淡。我也正在学数据结构和算法,而且基本还是入门水平。所以代码水平肯定很低。如发现问题,欢迎反馈。如果你是和我一样的菜鸟,咱们共同进步;如果你是大神,欢迎指点。

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++下面是完全调得通的。可能在某些编译器下不能顺利通过。如有此类问题请告诉我,共同进步。
代码大概就是这些。我这里只是起了头。对于链表的删除操作,统计操作等都没有设计。抛土引玉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值