用头插法创建单链表 作者 朱晓龙 单位 西安邮电大学

用头插法创建单链表
分数 20
作者 朱晓龙
单位 西安邮电大学
Creat_LinkList()函数是使用头插法建立一个带头节点的单链表。函数须返回单链表的头指针,空链表须返回NULL。

函数接口定义:
LinkList Creat_LinkList();
LinkList是函数返回的头指针类型。

西邮的科班不会写链表?数据结构入门都没开始?
好好学习这个文档:https://blog.csdn.net/qq_41028985/article/details/82859199

c语言实现算法:

//定义单链表的结构体
typedef struct LNode {
    int data; //数据域
    struct LNode *next; //指针域
}LNode, *LinkList; //LNode为结构体别名,LinkList为指向结构体的指针类型别名

//创建带头节点的单链表,使用头插法
LinkList Creat_LinkList() {
    //创建头节点
    LinkList L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL; //头节点的指针域初始化为NULL
    int x;
    while (scanf("%d", &x) != EOF) { //循环读入数据
        //创建新节点
        LNode *s = (LNode*)malloc(sizeof(LNode));
        s->data = x; //将数据存入新节点的数据域
        s->next = L->next; //将新节点插入到头节点后面
        L->next = s; //更新头节点的指针域,指向新节点
    }
    return L; //返回头节点指针
}


函数说明:

  • 定义单链表的结构体,包含数据域 data 和指针域 next

  • Creat_LinkList() 函数用于使用头插法建立一个带头节点的单链表

  • 函数首先分配一个头结点 L 的空间,将其指针域 next 初始化为 NULL

  • 然后循环读入整数 x,每读入一个整数,就新建一个节点 s,将其数据域初始化为 x,将其指针域指向头节点 L 的下一个节点,再将头节点 L 的指针域指向新节点 s

  • 最后返回单链表的头指针 L

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7790577
  • 除此之外, 这篇博客: 单链表的基本操作C语言详解中的 头插法创建单链表LinkList Head_CreatList(LinkList* L) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • LinkList Head_CreatList(LinkList* L)						 //头插法创建单链表,创建完成后元素次序和输入时相反。引入尾插法
    {
    	int x;													//新插入的结点值
    	printf("输入需要插入的元素值\n");
    	scanf("%d", &x);
    	while (x != 9999)										//输入9999时表示结束
    	{
    		LinkList s = (Node*)malloc(sizeof(Node));				 //创建新结点
    		s->data = x;										//输入结点的值
    		s->next = (*L)->next;
    		(*L)->next = s;
    		(*L)->data++;                                        //单链表长度加一
    		printf("插入成功\n");
    		printf("输入需要插入的元素值(输入9999结束插入)\n");
    		scanf("%d", &x);
    	}
    	return *L;                                              //返回单链表地址
    }
    
  • 以下回答由chatgpt基于相关博客总结生成:

    头插法创建带头节点的单链表,函数接口定义如下:

    typedef struct ListNode {
        int val;
        struct ListNode *next;
    } ListNode;
    
    ListNode* createList(int* nums, int numsSize);
    void printList(ListNode* head);
    

    需要注意的问题: 1. 需要使用指针,修改链接指针的指向。 2. 需要创建头节点,并使用头节点来初始化链表的指针,防止链表为空时操作空指针。 3. 需要根据插入顺序倒序插入链表元素,以保证头节点指向链表的第一个元素。

    具体的解决方案如下:

    ListNode* createList(int* nums, int numsSize) {
        ListNode* head = (ListNode*)malloc(sizeof(ListNode));
        head->next = NULL;
    
        for (int i = numsSize - 1; i >= 0; i--) {
            ListNode* node = (ListNode*)malloc(sizeof(ListNode));
            node->val = nums[i];
            node->next = head->next;
            head->next = node;
        }
    
        return head;
    }
    
    void printList(ListNode* head) {
        ListNode* cur = head->next;
        while (cur) {
            printf("%d ", cur->val);
            cur = cur->next;
        }
        printf("\n");
    }
    

    在创建链表时,先创建头节点,并使用头节点来初始化链表的指针。然后从数组的最后一个元素开始遍历,创建新节点并插入链表的头部,保证新元素插入链表的顺序与数组顺序相反。因为是使用头插法创建链表,所以最终的链表顺序与数组顺序相同。

    在输出链表的过程中,从头节点的下一个节点开始遍历,依次输出链表的每个元素的值,直到链表为空。