单链表的插入问题

单链表的删除示意图

从图中我们可以看出,如果要把b这个节点删除,有两种方法:
1、让C(包括C)后面的数据整体上向前移动一个位置,把b位置的数据进行覆盖处理
2、利用a这个节点进行操作。利用a->next = a->next->next来把a的下一个指针指向c,并把b的next指针置空即可

讨论:
1)第一种方法,的确可以使得b的数据被覆盖删除,但是问题是,如果c后面的数据有很多,而你又必须记下当前位置和链表尾部位置时才能进行的操作,那么在时间上就消耗比较多,这种方法不建议使用

2)第二种方法,只要我找到了删除点的前一个位置,那么我就可以使用结构体指针的作用改写当前位置next指向的位置。

程序:

typedef struct node 
{
    int data;
    struct node next;
}*listlink;

void display(listlink head)
{
    listlink p = head->next;
    while(p != NULL)
    {
        printf("%d\t",p->data);
        p = p->next;
    }
    printf("\n");
}


bool delete_node(int val,linklist head)
{
    listlink p = head->next;
    listlink q = head;
    if(p->next == NULL)
    {
        printf("No data delete\n");
        return false;
    }
    while(p != NULL)
    {
        if(p->next->data == val)
        {
            q->next = p->next;
            free(p);
        }

        else
        {
            q = p;
        }

        p = p->next;
    }

    display(head);
    return true;
}

int main()
{
    int val,value;
    while(1)
    {
        int ret = scanf("%d",&val);
        if(ret != 1)
            break;
        printf("enter a nuber:");
        scanf("&d",&value);
        switch(val)
        {
            case 1:insert(value,head)//这个插入函数请自己写
                    break;
            case 2:delete(value,head);break;
            default:break;
        }
    }
    return 0;
}

注意,删除的前提是已经有插入的数据,不然就没办法删除
插入的程序比较简单,留给读者自己编写:

1、创建一个节点,并让这个节点的next指向NULL,数据有键盘输入
2、判断插入的数据是否为尾端(这里采用尾端插入),是的话就开始插 入
3、利用一下语句(p = p->next,new为创建好的新节点)
new->next = NULL;
p->next = new;
即可创建插入一个节点

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表插入操作是将一个新的节点插入到链表中的指定位置。具体实现步骤如下: 1. 创建一个新的节点,命名为new_node,并设置其数据域为待插入元素值; 2. 找到插入位置的前一个节点,可以从头结点开始遍历链表,直到找到插入位置的前一个节点,或者链表已经遍历到末尾; 3. 将new_node节点的next指针指向插入位置的后一个节点; 4. 将插入位置的前一个节点的next指针指向new_node节点。 下面是单链表插入操作的示例代码实现: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 在单链表的指定位置插入一个新的元素 void insert(ListNode* head, int pos, int val) { // 创建新的节点 ListNode* new_node = (ListNode*)malloc(sizeof(ListNode)); new_node->val = val; new_node->next = NULL; // 找到插入位置的前一个节点 ListNode* pre = head; for (int i = 0; i < pos - 1 && pre != NULL; i++) { pre = pre->next; } if (pre == NULL) { printf("Insert position is invalid!\n"); return; } // 插入新的节点 new_node->next = pre->next; pre->next = new_node; } // 打印单链表 void printList(ListNode* head) { ListNode* p = head->next; while (p != NULL) { printf("%d ", p->val); p = p->next; } printf("\n"); } // 测试单链表插入操作 int main() { // 创建头结点 ListNode* head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; // 插入元素 insert(head, 1, 1); insert(head, 2, 2); insert(head, 3, 3); insert(head, 4, 4); printList(head); return 0; } ``` 输出结果为:1 2 3 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值