像大部分同学一样,上学期的C语言课程设计里有个《学生信息管理系统》的题目,令人汗颜的是不少同学直接定义了一个大数组;当然老师也挺仁慈的,并不介意,毕竟实现了需求,而且代码写起来也简单多了,何乐而不为呢。
但是!但是!咱能不能专业点?也许系统配置没那么好,也许只有1KB的可用内存(尤其是缺乏资源的单片机上),这时候就要用到链表了。
链表:顾名思义就是把数据像链子一样串起来的一个表(
http://zh.wikipedia.org/wiki/链表)
特性:1)按需创建节点,不像线性表在创建时就要设置数据的大小。
2)节点删除方便,不像线性表删除一个数据还得移动剩下的数据。
3)节点访问方便,即可以循环,又可以递归访问任意数据,但是平均访问效率低于线性表。
1)先来定义一个最简单的链表数据结构
typedef struct _LNODE{
int dat;
struct _LNODE *next;
}LNODE;
2)创建链表
LNODE *creat_node(int value){
LNODE *link_node=NULL;
link_node=(LNODE *)malloc(sizeof(LNODE));
link_node->dat=value;
link_node->next=NULL;
return link_node;
}
3)在尾部添加链表的节点
void add_node(LNODE *s,int value){
while(s->next!=NULL){
s=s->next;
}
s->next=(LNODE *)malloc(sizeof(LNODE));
s=s->next;
s->dat=value;
s->next=NULL;
}
4)删除第n个节点
void delete_data(LNODE *s,int n){
LNODE *q;
if(n<1)return;
while(--n&&s->next->next!=NULL){
s=s->next;
}
if(s->next->next==NULL){
if(n==0){
q=s->next;
s->next=NULL;
free(q);
}
}else{
q=s->next;
s->next=s->next->next;
free(q);
}
}
5)删除指定节点
void delete_node(LNODE *s,LNODE *p)
{
while(s->next!=NULL && s->next!=p){
s=s->next;
}
if(s->next!=NULL){
s->next=s->next->next;
free(s->next);
}else{
s->next=NULL;
}
}
6)打印链表
void print_node(LNODE *s){
if(s){
printf("%d\t",s->dat);
print_node(s->next);
}
}
7)插入链表,到第p的位置
void insert_node(LNODE *s,int p,int value){
LNODE *t;
while(--p&&s->next!=NULL){
s=s->next;
}
t=(LNODE *)malloc(sizeof(LNODE));
t->dat=value;
t->next=s->next;
if(s->next==NULL){
if(p>0)return;
s->next=t;
t->next=NULL;
}else{
s->next=t;
}
}
8)查找数据
LNODE* find_data(LNODE *s,int value)
{
if(s==NULL)
return NULL;
if(value==s->dat)
return s;
return find_data(s->next,value);
}
改来改去总感觉很不完美,现就这样吧。或许几个月后就会觉得现在写的东西很稚嫩,看了CSDN上的大神们写的类似的东西,看到二级指针就晕了。。。