单链表的插入与删除

链表是数据结构中的一种线性结构,表示数据运算之间的一种抽象关系。

1、单链表的结构如下:

typedef struct node{
    datatype data;  //数据
    struct node *next; //指向下一个节点的指针
}linklist_s;

        其中包括一个数据域和一个指针域,向单链表中插入成员时只需要再次分配一个同样的变量,让上一个变量中的指针域指向下一个节点即可,比起顺序表来说,链表更加灵活。

2、单链表的创建

        *先创建链表头,将指针域指向NULL,将数据域设置0


linklist_s *LinkListCreate(void)
{
    linklist_s *h;//定义一个linklist_s结构体类型的变量 *h
    h = (linklist_s *)malloc(sizeof(*h));//通过malloc申请内存空间
    h->data =0;     //将数据域设值为0
    h->next = NULL;  //指针域指向空

    return h;
}

3、单链表的插入

       *头插法:

                

        *尾插法:

                

        *位置插法:

                 

 头插法代码如下:

(尾插法与位置插法只需要找到位置之后插入节点,本质上与头插法是一样的)

//头插法:
int LinkListInsert(linklist_s *h,datatype data)
{
    linklist_s *tmp;
    tmp = (linklist_t *)malloc(sizeof(*tmp));

     //1.分配临时的节点,将data放入到节点的数据域中
    tmp->data = data;

    //2.将tmp插入到节点中

    tmp->next = h->next;
    h->next = tmp;

    //3.成功返回0
    return 0;
}

4、单链表的删除

        *头删法

                

        *尾删法      

                

            *位置删法

                

  头删法代码如下:

(尾删法与位置删法只需要找到位置之后删除节点,本质上与头删法是一样的)


int LinkListDeleteHead(linklist_s *h)
{
    linklist_s *tmp;
 
    //1.让tmp指向要删除的节点
    tmp = h->next;

    //2.让h->next指向下下一个节点
    h->next = h->next->next;


    //3.释放节点占用的内存
    if(tmp != NULL){
        free(tmp);
        tmp = NULL;
    }

    return 0;
}

如何找到要删除的位置?

           //尾删法:让h->next->next走到NULL的位置

   //尾删法:让h->next->next走到NULL的位置
    while (h->next->next != NULL) {
        h = h->next;
    }

          //位置删法:(pos为要删除的位置)

while (h->next != NULL) {
        if (pos != 0) {
            pos--;
            h = h->next;
        } 

***********如何将一个正序的单链表倒置呢?*********


void LinkListReverse(linklist_s *h)
{
    linklist_s *tmp,*iter;

    //让iter指针指向头节点之后的节点
    iter = h->next;
    //先让h->next指向空,意思链表中没有任何的节点
    h->next = NULL;

    //如果iter不为空,循环继续
    while(iter){
        //让tmp取到第一个节点
        tmp = iter;

        //让iter指向下一个节点
        iter = iter->next;

        //使用头插法将tmp插入到h之后
        tmp->next = h->next;
        h->next = tmp;
    }
}

 未完待续............

  • 36
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值