用头插法创建单链表
分数 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
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; //返回单链表地址
}
头插法创建带头节点的单链表,函数接口定义如下:
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");
}
在创建链表时,先创建头节点,并使用头节点来初始化链表的指针。然后从数组的最后一个元素开始遍历,创建新节点并插入链表的头部,保证新元素插入链表的顺序与数组顺序相反。因为是使用头插法创建链表,所以最终的链表顺序与数组顺序相同。
在输出链表的过程中,从头节点的下一个节点开始遍历,依次输出链表的每个元素的值,直到链表为空。