数据结构之单链表结构

数据结构之单链表结构

  • 单链表结构

提示
博主:来自火星的萨满_906285288
博客地址:http://blog.csdn.net/qq_29924041/article/category/7109408
本文来自linuxC一站式编程中的案例


概念

当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。
如下图所示:
单链表的结构

每一个链表有一个头指针,通过头指针可以找到第一个节点,每个节点都可以通过指针域找到它的后继,最后一个节点的指针域为NULL,表示没有后继,即最后一个没有指向。
注意:
数组在内存中是连续存放的过程,但是链表在内存中的布局是不规则的,我们知道访问一个数组到时候,是可以通过指针的下标来找到对应的元素的,也就是说指针支持随机访问,但是这种随机访问的形式在链表中是不会支持的。链表结构只能通过前一个指针域来得知后一个元素的地址。也就是链表只能从头指针开始按照顺序来进行访问各个节点,在实际应用封装过程中,很多类型都是通过链表的形式来进行封装的



实例代码展示部分

/*
 * ===========================================================================
 *
 *       Filename:  linkedlist.h
 *    Description: µ•¡¥±ÌµƒΩ·ππÕ∑Œƒº˛µƒ∂®“ 
 *        Version:  1.0
 *        Created:  2018ƒÍ01‘¬20»’ 21 ±45∑÷27√Î
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#ifndef __LINKEDLIST_H_
#define __LINKEDLIST_H_
typedef struct node* link;
struct node{
  unsigned char item;
  link next;
};
link make_node(unsigned char item);
void free_node(link p);
link search(unsigned char key);
void insert(link p);
void delete(link p);
void traverse(void(*visit)(link));
void destory(void);
void push(link p);
link pop(void);

#endif
/*
 * ===========================================================================
 *
 *       Filename:  linkedlist.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2018ƒÍ01‘¬20»’ 21 ±51∑÷30√Î
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */
#include<stdio.h>
#include "linkedlist.h"

static link head = NULL;

link make_node(unsigned char item){
   link p = (link)malloc(sizeof(*p));
   if(p == NULL){
    perror("malloc link error");
    exit(0);
   }
   p->item = item;
   p->next = NULL;
}

void free_node(link p){
  if(p != NULL)
    free(p);
}

link search(unsigned char key){
  link p ;
  for(p = head;p;p=p->next){
    if(p->item == key){
      return p;
    }
  }
  return NULL;
}

void insert(link p){
  p->next = head;
  head = p;
}

void delete(link p){
  link pre;
  if(p == head){
    head = p->next;
    return;
  }
  for(pre = head;pre;pre = pre->next)
    if(pre->next == p){
      pre->next = p->next;
      return;
    }
}

void traverse(void(*visit)(link)){
  link p;
  for(p = head;p;p = p->next){
    visit(p);
  }
}

void destory(void){
   link q,p = head;
   head = NULL;
   while(p){
     q = p;
     p = p -> next;
     free_node(q);
   }
}

void push(link p){
  insert(p);
}


link pop(void){
  if(head == NULL){
    return NULL;
  }else{
    link p = head;
    head = head -> next;
    return p;
  }
}
/*
 * ===========================================================================
 *
 *       Filename:  main.c
 *    Description:  
 *        Version:  1.0
 *        Created:  2018ƒÍ01‘¬20»’ 22 ±06∑÷31√Î
 *       Revision:  none
 *       Compiler:  gcc
 *         Author:   (), 
 *        Company:  
 *
 * ===========================================================================
 */

#include<stdio.h>
#include"linkedlist.h"

void print_item(link p){
  printf("%d\n",p->item);
}


int main(int argc,char*argv[]){
  link p = make_node(10);
  insert(p);
  p = make_node(5);
  insert(p);
  p = make_node(90);
  insert(p);
  p = search(5);
  delete(p);
  free_node(p);
  traverse(print_item);
  destory();

  p = make_node(100);
  push(p);
  p = make_node(200);
  push(p);
  p = make_node(250);
  push(p);
  while(p = pop()){
    print_item(p);
    free_node(p);
  }



  return 0;
}

以上代码主要是来自linux的一站式编程

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值