数据结构C++单链表的实现

前言:之前看过这方面的知识,但是因为用得少,所以也忘记了。因为现在的工作经常要看源码,而源码里面经常也会有数据结构里面的知识,比如说,handler 相关的消息出队和入队。所以打算写个一系列的文章帮助自己加深印象。

一、单链表介绍
单链表的每一个节点由数据域和指针域组成。如图1.1所示
图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;
}

好了,单链表就写到这里,后续会有一系列的,包括双链表、队列、栈、循环队列,二叉树等。有问题欢迎指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值