静下心来写算法(之单向链表)

     像大部分同学一样,上学期的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上的大神们写的类似的东西,看到二级指针就晕了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值