C语言在单链表中插入一个结点

C语言在单链表中插入一个结点

以前面建立的动态链表为例,编写一个函数,能够在链表中指定位置插入一个结点。

假定链表已按升序排列,将要插入的结点依次与链表中的各结点比较,寻找要插入的位置。结点可以插在表头,表中或表尾。

结点在插入过程中存在以下几种情况:
(1)如果原表是空表,只需使链表的头指针head指向被插结点即可。
(2)如果如果被插结点值最小,则应插入第一个结点之前,这种情况下使头指针head指向被插结点,被插结点的指针域指向原来的第一结点即可。
(3)如果在链表中某位置插入,使插入位置的前一结点的指针域指向被插结点,被插结点的指针域指向插入位置的后一结点即可。
(4)如果被插结点值最大,则在表尾插入,使原表尾结点指针域指向被插结点,被插结点指针域指向NULL即可。

node * insert(node * head, int x)
{
     node * last, * current, * p;
     //要插入的结点
     p = (node *)malloc(sizeof(node));
     p->num = x;
     //空表插入
     if(head == NULL)
     {
         head = p;
         p->next = NULL;
         return head;
     }
     //找插入位置
     current = head;
     while(x > current->num && current->next != NULL)
     {
          last = current;
          current = current->next;
     }
     if(x <= current->num)
     {
         if(head == current)//在第一结点之前插入
         {
             p->next = head;
             head = p;
             return head;
         }
         else//中间位置插入
         {
             p->next = current;
             last->next = p;
             return head;
         }
     }
     else//链尾插入
     {
         current->next = p;
         p->next = NULL;
         return head;
     }
}
  • 16
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于第一个问题,实现正序或逆序生成单链表的代码示例如下: // 定义单链表结构体 struct ListNode { int val; struct ListNode *next; }; // 正序生成单链表 struct ListNode* createList(int* nums, int numsSize) { struct ListNode* head = NULL; struct ListNode* tail = NULL; for (int i = 0; i < numsSize; i++) { struct ListNode* node = malloc(sizeof(struct ListNode)); node->val = nums[i]; node->next = NULL; if (head == NULL) { head = node; tail = node; } else { tail->next = node; tail = node; } } return head; } // 逆序生成单链表 struct ListNode* createListReverse(int* nums, int numsSize) { struct ListNode* head = NULL; for (int i = numsSize - 1; i >= 0; i--) { struct ListNode* node = malloc(sizeof(struct ListNode)); node->val = nums[i]; node->next = head; head = node; } return head; } 对于第二个问题,在单链表插入一个元素结点的代码示例如下: // 在单链表插入一个元素结点 void insertNode(struct ListNode* head, int index, int val) { struct ListNode* node = malloc(sizeof(struct ListNode)); node->val = val; struct ListNode* prev = NULL; struct ListNode* curr = head; for (int i = 0; i < index && curr != NULL; i++) { prev = curr; curr = curr->next; } if (prev == NULL) { node->next = head; head = node; } else { prev->next = node; node->next = curr; } } 对于第三个问题,在单链表删除一个元素结点并回收该结点的代码示例如下: // 在单链表删除一个元素结点并回收该结点 void deleteNode(struct ListNode* head, int index) { struct ListNode* prev = NULL; struct ListNode* curr = head; for (int i = 0; i < index && curr != NULL; i++) { prev = curr; curr = curr->next; } if (prev == NULL) { head = curr->next; } else { prev->next = curr->next; } free(curr); }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值