先扯一点淡。我也正在学数据结构和算法,而且基本还是入门水平。所以代码水平肯定很低。如发现问题,欢迎反馈。如果你是和我一样的菜鸟,咱们共同进步;如果你是大神,欢迎指点。
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++下面是完全调得通的。可能在某些编译器下不能顺利通过。如有此类问题请告诉我,共同进步。
代码大概就是这些。我这里只是起了头。对于链表的删除操作,统计操作等都没有设计。抛土引玉。