数据结构之单链表链表建立
文章目录
一、引入文件
#include <stdio.h>
#include <malloc.h>
二、定义结构体
struct ListNode {
int val;
struct ListNode* next;
};
结构体成员变量包括两部分,一是数据域val,二是指针域后继节点指针next
三、单链表实现原理
1.链表的存储结构
①节点存储地址是任意的,相邻元素的物理地址不一定相邻
②只能通过头指针进入链表,通过指针域依次向后顺序扫描链表(顺序存取)
2.单链表的特点
单链表由表头唯一确定,可以用头指针命名单链表(如头指针L,则称链表为L)
3.带头结点的单链表
头结点指针域为空,或表示为head->next=NULL,即链表为空表
带头节点的好处
①便于对首元结点处理,因为首元节点的地址保存在头结点的指针域中,保证链表的第一位置操作和后面的节点一样
②便于非空表与空表的处理,因为头指针都是指向头结点的非空指针
4.不带头节点的单链表
head->next=NULL,即链表为空表
四、头插法建立单链表
void CreateList(struct ListNode* L, int* a, int n)
{
struct ListNode* s;
s = L->next;
//头插法
for (int i = 0; i < n; i++) {
s = (struct ListNode*)malloc(sizeof(struct ListNode));
s->val = a[i];
//进入下一节点
s->next = L->next;
L->next = s;
}
}
五、尾插法建立单链表
oid CreateList(struct ListNode* L, int* a, int n)
{
struct ListNode* L h;
h=L;//拷贝头指针
struct ListNode* s;
s = L->next;
//尾插法
for (int i = 0; i < n; i++) {
s = (struct ListNode*)malloc(sizeof(struct ListNode));
//尾插入节点
s->val=a[i]
s->next=h->next;
h->next=s;
//进入下一节点
h=s;
s=s->next;
}
}
六、执行结果
void printList(struct ListNode* L) {
struct ListNode* p;
p = L->next;//首元位置
while (p!= NULL) {
printf("%d ", p->val);
p = p->next;
}
}
void main()
{
struct ListNode* l1, * l2;
l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
l1->next = NULL;
l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
l2->next = NULL;
int a[5] = {1,2,3,4,5 };
CreateList_head(l1, a, 5);
CreateList_tail(l2, a, 5);
printf("头插法:");
printList(l1);
printf("\n");
printf("尾插法:");
printList(l2);
}