数据结构之单链表

1.单链表的插入

头插

这里写图片描述

中间插

这里写图片描述

尾插

这里写图片描述

2.单链表的删除

bool Remove(LinkList& first, int i, dataType& x)
{
    //在链表中删除第 i 个结点。如果要删除表中第 1 个
    //结点,需要改变表头指针,所以 first 定义为引用
    //型,被删元素的值通过引用型参数 x 返回
    LinkNode *p, *q;
    int k;
    if (i == 0)
        return false;    //无效的删除位置
    if (i == 1)
    {
        q = first;
        first = first->link;
    }
    else
    {                 //删除链中或链尾结点
        p = first;  int k = 1;    //找第 i-1个结点
        while (p != NULL && k < i - 1)
        {
            p = p->link; k++;
        }


        if (p == NULL || p->link == NULL)
        {
            printf(“无效的删除位置!\n”);
            return false;       //链太短,没有删除结点
        }
        else
        {                               //删除结点p->link
            q = p->link;            //重新链接, 摘下*q
            p->link = q->link;
        }
        x = q->data;  
        free(q);    //删除*q
        return true;
    }
}

链表长度计算

int Length(LinkList first)
{
    LinkNode *p = first->link;
    //检测指针 p 跳过表头结点指示首元结点
    int count = 0;
    while (p != NULL)
    {            //逐个结点计数
        p = p->link;   count++;
    }
    return count;
}

链表查找数值

这里写图片描述

LinkNode *Search ( LinkList first, DataType x ) 
{
//在链表中从头搜索其数据值为 x 的结点 
      LinkNode * p = first->link;        //p为检测指针
      while ( p != NULL && p->data != x )  
             p = p->link;
      return p;     
}

while ( p != NULL && p->data != x )
这个条件不能写成while(p->data != x && p != NULL)
因为前面为假 && 就不再判断后面了,见《c陷阱和缺陷》

带头节点的单链表

头结点位于表的最前端,本身不带数据,仅标志表头。

目的:
1.统一空表与非空表的操作
2.简化链表操作的实现。

头插

void insertFront(LinkList& first, DataType endTag)
{
    DataType val;   LinkNode *s;
    scanf(“%d”, &val);          //读入一数据
    while (val != endTag)           //若不是endTag
    {   
        s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = val;              //创建新结点
        s->link = first->link;      //插入到表前端
        first->link = s;
        scanf(“%d”, &val);      //读入下一数据
    }
}

这里写图片描述

尾插

void insertRear(LinkList& first, DataType endTag) 
{
    DataType val;
    LinkNode *s, *rear = first; //rear指向表尾
    scanf(“%d”, &val);      //读入一数据
    while (val != endTag) 
    {
        s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = val;          //创建新结点并赋值
        rear->link = s;   rear = s; //插入到表尾
        scanf(“%d”, &val);      //读入下一数据     
    }
    rear->link = NULL;      //表收尾
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值