链表操作 基本程序

(1)向后插入元素

void insert_tail(link p)
{
    link q = NULL;
    if(NULL == head)//判断head是否为空
    {
        head = p;//head为空则直接赋值
        return;
    }
    //head不为空
    //则遍历链表,直至最后一个节点
    for(q = head; q->next;q=q->next);
    q->next = p;//将新节点放置在最后一个节点的后面
    需要将新节点的next指针置为NULL吗?为什么?
}
(2) 中间插入元素


void insert_mid(link p)
{
    link q = NULL;
    link r = NULL;
    if(head == NULL)
        return;
    else
    {
        q = head;
        p->next = q->next;
        q->next = p;
    }
}

(3)插入排序


void insert_sort(link p)
{
    link q = NULL;
    link r = NULL;
    if(head == NULL)
    {
        head = p;
        return;
    }
    for(q = head; q; q=q->next)
    {
        if(q->item > p->item)
        {
            p->next = q;
            if(r)
                r->next = p;//mid
            else
                head = p;//head
            break;
        }
        r = q;
    }
    if(q == NULL)
    {
        r->next = p;//tail
    }    
}

(4)链表逆序


void reverse_1()
{
    link head1 = NULL;
    link p = NULL;
    while(head != NULL)
    {
        p = head;
        head = p->next;
        
        p->next = head1;
        head1 = p;
    };
    }
    head = head1;
}

void reverse_2()
{
    link r = NULL;
    link p = NULL;
    link q = NULL;
    for(p = head;p;)
    {
        q = p->next;
        p->next = r;        
        r = p;
        p = q;        
    }
    head = r;
}
(6) 删除 前(后)面元素
void del_3()
{
    link p = NULL;
    int i = 1;
    for(i = 1; i <= 10; i++)
    {
        p = make_node(i);
        insert(p);
    }
    p = head;
    for(i = 1;i < 3;i++)
        p = p->next;
    printf("3: %d\n",p->item);
    delete(p);
    free_node(p);
}
void del_r_3()
{
    link p = NULL;
    link q = NULL;
    link r = NULL;
    int i = 1;
    for(i = 1; i <= 10; i++)
    {
        p = make_node(i);
        insert(p);
    }
    p = head;q = p->next;
    while(q->next)
    {
        r = p;
        p = q;
        q = q->next;
    }
    printf("r_3: %d\n",r->item);
    delete(r);
    free_node(r);
}
void del_r_k(int k)
{
    link p = NULL;
    link q = NULL;
    int i = 1;
    for(i = 1; i <= 10; i++)
    {
        p = make_node(i);
        insert(p);
    }
    p = head;
    for(i = 1;i < k;i++)
    {    
        if(p)
            p = p->next;
        else
            return;
    }
    q = head;
    for(;p->next;)
    {
        p = p->next;
        q = q->next;
    }
    printf("r_k: %d\n",q->item);
    delete(q);
    free_node(q);
}
(7) 约瑟夫环
void josphus(int M, int N)
{
    link r = NULL;
    link p = NULL;
    link head = NULL;
    link tail = NULL;
    int i = 0;
    for(i = M; i >= 1; i--)
    {
        p = malloc(sizeof(*p));
        p->item = i;
        p->next = NULL;
        if(head == NULL)
        {
            head = p;
            tail = p;
        }
        else
        {
            p->next = head;
            head = p;
        }
    }
    tail->next = head;
    
    p = head;
    while(p!= p->next)
    {
        for(i = 1; i < N; i++)
        {
            r = p;
            p = p->next;
        }
        
        r->next = p->next;
        free(p);
        p = r->next;
    }
    printf("%d\n",p->item);
    free(p);
    head = tail = NULL;
}

转载于:https://www.cnblogs.com/jade-L/p/3210144.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的链表是一种常见的数据结构,它由多个节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表有很多种类型,包括单向链表双向链表和循环链表等。 以下是链表基本操作: 1. 创建链表节点 链表节点通常由两个部分组成:数据和指向下一个节点的指针。我们可以定义一个结构体来表示节点: ```c++ struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; ``` 这个结构体包含一个整数和一个指向下一个节点的指针,其中构造函数用于初始化节点的值。 2. 插入节点 插入节点是链表中最基本操作之一。我们可以将新节点插入到链表的任何位置,包括链表的头部、尾部或中间。 ```c++ void insertNode(ListNode*& head, int val) { ListNode* newNode = new ListNode(val); newNode->next = head; head = newNode; } ``` 这个函数将创建一个新节点并将其插入到链表的头部。 3. 删除节点 删除节点也是链表中最基本操作之一。我们可以从链表的任何位置删除节点,包括链表的头部、尾部或中间。 ```c++ void deleteNode(ListNode*& head, int val) { if (head == NULL) return; if (head->val == val) { ListNode* temp = head; head = head->next; delete temp; return; } ListNode* prev = head; ListNode* curr = head->next; while (curr != NULL) { if (curr->val == val) { prev->next = curr->next; delete curr; return; } prev = curr; curr = curr->next; } } ``` 这个函数将从链表中删除具有指定值的节点。 4. 遍历链表 遍历链表是查看链表中节点值的一种方法。 ```c++ void traverseList(ListNode* head) { ListNode* curr = head; while (curr != NULL) { cout << curr->val << " "; curr = curr->next; } } ``` 这个函数将遍历整个链表,并输出每个节点的值。 这些是链表基本操作。在实际的应用程序中,我们可能需要使用更多的操作来实现特定的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值