我比小白还小白 2022-02-02 15:34 采纳率: 87.5%
浏览 99
已结题

还是有点搞不懂链表,向大家请教来了= =

单向链表的插入
在新建单向链表代码基础上,增加插入节点的函数,实现在链表中按升序的顺序将指定的数值 data 插入相应的节点。也就是将data插入在第一个大于data的节点之前。

插入节点函数接口:
struct link *InsertNode(struct link *head, int data)
head 是链表头节点的指针
data是要插入的节点的数值。
函数返回插入相应节点后,头节点的指针。
主函数示例:




#include <stdio.h>
#include <stdlib.h>
struct link
{
    int data;
    struct link *next;
};

struct link *AppendNode(struct link *head,int data);
void DisplyNode(struct link *head);
void DeleteMemory(struct link *head);
struct link * DeleteNode(struct link *head,int data);
struct link *InsertNode(struct link *head, int nodeData);

int main()
{
    char    c;
    int data = 0;
    struct link *head = NULL;      /* 链表头指针 */
    while (1)
    {
        scanf("%d",&data);
        if (data==-1)
            break;

        head = AppendNode(head,data);/* 向head为头指针的链表末尾添加节点 */
    }
    DisplyNode(head);        /* 显示当前链表中的各节点信息 */
    scanf("%d",&data);
    head = InsertNode(head,data);
    DisplyNode(head);        /* 显示当前链表中的各节点信息 */
    DeleteMemory(head);           /* 释放所有动态分配的内存 */
    return 0;
}

输入格式:
第一行: 一系列以-1结束的数值,用以构建单向链表。

第二行: 指定的数值,将此数值插入链表中第一个大于该数值的节点之前。

输出格式:
在构建单向链表后,显示整个链表。 在插入指定数值后,再次显示整个链表。

输入样例:
在这里给出一组输入。例如:

1 3 5 7 9 -1
6
输出样例:
在这里给出相应的输出。例如:

1->3->5->7->9
1->3->5->6->7->9
输入样例:
在这里给出一组输入。例如:

1 3 5 3 1 -1
4
输出样例:
在这里给出相应的输出。例如:

1->3->5->3->1
1->3->4->5->3->1

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2022-02-02 16:51
    关注

    供参考:

    #include <stdio.h>
    #include <stdlib.h>
    struct link
    {
        int data;
        struct link* next;
    };
    struct link* AppendNode(struct link* head, int data);
    void DisplyNode(struct link* head);
    void DeleteMemory(struct link* head);
    struct link* DeleteNode(struct link* head, int data);
    struct link* InsertNode(struct link* head, int data);
    
    int main()
    {
        char c = 0;
        int data = 0;
        struct link* head = NULL;      // 链表头指针 
        while (1)
        {
            scanf("%d", &data);
            if (data == -1)
                break;
            head = AppendNode(head, data);// 向head为头指针的链表末尾添加节点 
        }
        DisplyNode(head);        // 显示当前链表中的各节点信息 
    
        scanf("%d", &data);
        head = InsertNode(head, data);  //插入指定数值
        DisplyNode(head);
    
        scanf("%d", &data);
        head = DeleteNode(head, data); //删除指定值的结点
        DisplyNode(head);        // 显示当前链表中的各节点信息 
    
        DeleteMemory(head);           // 释放所有动态分配的内存
        return 0;
    }
    struct link* AppendNode(struct link* head, int data)
    {
        struct link* p = head;
        if (head == NULL) {
            head = (struct link*)malloc(sizeof(struct link));
            head->next = NULL;
            head->data = data;
        }
        else {
            while (p->next) 
                p = p->next;
            p->next = (struct link*)malloc(sizeof(struct link));
            p->next->next = NULL;
            p->next->data = data;
        }
        return head;
    }
    void DisplyNode(struct link* head)
    {
        struct link* p = head;
        if (head == NULL)
            return;
        while (p) {
            printf(p == head ? "%d" : "->%d", p->data);
            p = p->next;
        }
        printf("\n");
    }
    struct link* DeleteNode(struct link* head, int data)
    {
        struct link* p = head, * pre = NULL;
        while (p) 
        {
            if (p->data == data){
                if (p == head) {
                    head = p->next;
                    free(p);
                    p = head;
                }
                else {
                    pre->next = p->next;
                    free(p);
                    p = pre;
                }
            }
            else {
                pre = p;
                p = p->next;
            }
        }
        return head;
    }
    struct link* InsertNode(struct link* head, int data)
    {
        struct link* p = head, * pre = NULL, * q = NULL;
        q = (struct link*)malloc(sizeof(struct link));
        q->next = NULL;
        q->data = data;
        while (p && p->data < q->data) {
            pre = p;
            p = p->next;
        }
        if (pre == NULL) {
            q->next = p;
            head = q;
        }
        else{
            q->next = pre->next;
            pre->next = q;
        }
        return head;
    }
    void DeleteMemory(struct link* head)
    {
        struct link* p;
        if (head == NULL)
            return;
        while (head) {
            p = head;
            head = p->next;
            free(p);
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月20日
  • 已采纳回答 2月12日
  • 创建了问题 2月2日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程