数据结构之单链表结构
- 单链表结构
提示
博主:来自火星的萨满_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的一站式编程