数据结构链表一

  • Post author:
  • Post category:其他




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



一、引入文件

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

}

在这里插入图片描述



版权声明:本文为qq_53889144原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。