数据结构链表一

数据结构之单链表链表建立

一、引入文件

#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);

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有几何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值