前言:之前看过这方面的知识,但是因为用得少,所以也忘记了。因为现在的工作经常要看源码,而源码里面经常也会有数据结构里面的知识,比如说,handler 相关的消息出队和入队。所以打算写个一系列的文章帮助自己加深印象。
一、单链表介绍
单链表的每一个节点由数据域和指针域组成。如图1.1所示
图1.1
数据域是存放数据,指针域放的是存放下一个节点的地址。现在大多数为了方便,我们都会有一个头结点,头结点的数据域不存放任何数据。指向头结点的指针叫头指针。带头结点的单链表,如图1.2所示
图1.2
不带头结点的单链表如图1.3所示:
图1.3
二、单链表的创建及操作:
1、创建 节点
//含有头结点的单链表,头结点只有指针域没有数据域
typedef struct Node{
int data;
struct Node * next;
}Node;
typedef struct Node * LinkList;//定义linklist
2.头插法创建单链表–每次插入的节点都在第一的位置
//头插法创建单链表,就是始终让新插入的节点在第一的位置
void creatListHead(LinkList *L, int num){
LinkList p;
int i = 0;
*L = (LinkList)malloc(sizeof(Node));//为头结点分配内存
(*L)->next = null;
for(int i=0; i< num; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;//随机生成100以内的数字
p->next = (*L)->next;
(*L)->next = p;
}
}
尾插法创建单链表:
//尾插法创建单链表,
void creatListTail(LinkList *L, int num){
LinkList p, r;
int i = 0;
*L = (LinkList)malloc(sizeof(Node));//为头结点分配内存
(*L)->next = null;
r=(*L);//r 指向头结点
for(int i=0; i< num; i++){
p = (LinkList)malloc(sizeof(Node));
p->data = rand()%100+1;//随机生成100以内的数字
r->next = p; //将 r指向新节点
r = p; //r 始终指向最后一个节点
}
r->next = null; //最后一个节点的指针域为置为 null;
}
3.整表删除
//整表删除
void deleteLinkList(LinkList *L){
LinkList p, q;
p = (*L)->next; //p 指向第一个节点
while(p){ //是否到表尾
q = p->next;
free(p); // 删除p节点,并进行内存释放
p = q;
}
(*L)->next = null; //头结点的指针域置空null
}
4.遍历整个链表
//遍历整个链表
void traverseLinkList(LinkList *L){
LinkList p = (*L)->next;
while(p){
printf(“%d”, p->data);
p = p->next;
}
}
5.在任意位置插入节点
//在任意位置插入节点
/**
* 1=<index<= 链表的长度
*/
int insert(LinkList *L, int value, int index){
LinkList p , s;
int i = 1;
p = (*L)//指向头节点、
while(p && i<index){
p = p->next;
i++;
}
if(!p || i>index){//没找到数据
return -1;
}
s = (LinkList)malloc(sizeof(Node));
s->data = value;
s->next = p->next;
p->next = s;
return 0;
}
6.在任意位置删除节点
/*
* 删除指定位置的节点
* 1=<index<= 链表的长度
*/
int delete(LinkList *L, int index){
LinkList p , q;
int i = 1;
p = (*L)//指向头节点、
while(p->next && i<index){
p = p->next;
i++;
}
if(!(p->next) || i>index){//没找到数据
return -1;
}
q = p->next;
int data = q->data;
p->next = q->next;
free(q);
return data;
}
7.获取链表长度
int getLength(LinkList *L){
LinkList p = (*L);
int i = 0;
while(p->next){
i++;
p = p->next;
}
return i;
}
好了,单链表就写到这里,后续会有一系列的,包括双链表、队列、栈、循环队列,二叉树等。有问题欢迎指出。