数据结果 链表及插入删除查找

链表跟线性表类似,但由于位置不是连续存放的,因此插入删除很方便,切时间复杂度不高。

链表的创建

首先我们得定义一个节点。

struct Node
{
    int data;
    Node *next;
    Node(int _data = 0, Node *_next = NULL) :data(_data), next(_next) {}
};

节点包括数据与和指针域,指针域指向它要连接的下一个节点,这里只是一个单一的节点,因此构造构造函数中设置了数据为0,指针为NULL。

后来把节点连接成一个链表

Node *createList(int n, int *data)
{
    Node *head = new Node;
    Node *tail, *s;
    tail = head;
    for (int i = 0; i < n; i++)
    {
        s = new Node(data[i], NULL);
        tail->next = s;
        tail = s;
    }
    return head;
}

n指的是我们想要建立的节点数,data指的是我们想要建立的节点的数据域。首先建立了一个头结点,这个头结点的数据域为0,指针为NULL,头结点的建立主要是为了我们以后进行删除和插入方便,可以不用进行分类情况,然后为了不让头节点移动,我们新建立另一个节点名为tail,就是尾结点,就是我们一建立节点,就把新建的节点视作尾节点,这通过tail->next=s,tail=s来实现。

插入节点

Node *findnode(Node *head, int i)
{
    Node *p = head;
    int count = 0;
    while (p&&count < i)
    {
        count++;
        p = p->next;
    }
    return p;
}

int insert(Node *head, int loc, int elem)
{
    if (loc<1 || loc>getlength(head) + 1)
        return 0;
    Node *p = findnode(head, loc - 1);
    Node *s = new Node(elem, p->next);
    p->next = s;
    return 1;
}

首先思路是先找到我们想要插入位置的前一个节点,然后找到后一个节点,然后建立一个插入的节点,然后把新的节点链接到前面的和后面的节点。前一个节点的查找是通过p=head,p=p->next来实习的,就是找到头节点,然后一个个来移动,直到找到前一个节点。

在Insert函数中p就是前一个前一个节点,p->next就是后一个节点,s是我们新建的节点,新建的节点的数据域为我们插入的elem,然后这个节点的指针域为p->next就是指向后一个节点,然后把新节点链接给前一个节点,p->next=s来实现前面的节点的链接。

删除节点

int deletenode(Node *head, int i)
{
    if (i<1 || i>getlength(head) + 1)
        return 0;
 
    Node *p = findnode(head,i - 1);
    p->next = p->next->next;
    return 1;
}
 

首先p就是我们删除的节点的前一个节点,然后把前一个节点的指针指向后后一个节点,就这样实现了释放一个节点。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值