初识链表的感悟

为什么使用链表

   1.管理系统的程序设计中引入大量的表格数据用结构体数组储存时必须知道数组长度单凡增加缩小一个元素都可能出错;(用大数目来定义数组长度造成内存浪费)
   2.在数组中插入或者删减元素都得移动数组中的大量元素。(效率低下)

链表是什么

链表是一种常见的采用动态存储分配方式的数据结构
数据结构是计算机存储、组织数据的方式。–>所以说链表是存储组织数据的!!!
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。–>链表的数据元素有什么特点呢???

链表结构

头指针–>头结点–>首元节点–>…–>表尾结点

依次介绍:

头指针:保存的地址指向一个变量(元素)
头结点:没错!头结点就是头指针指向的变量,头结点指向第一个有效结点。此元素分为两部分:数据(存放数据)和指针(指向下一元素)。在这里插入图片描述
首元结点:没错!首元结点就是第一个有效结点。
哎!为什么头结点不是第一个有效的嘞???欸!是因为头结点的数据域可以不使用。
那那那,为什么要头节点呢???因为哈创建,插入,删除带头结点的链表相比于不带头结点的代码更加简洁。(单链表部分会介绍;哎?怎么找不到呢,害,它在下一篇博客里–怎么使用链表
在这里插入图片描述

…代表:普通元素,分为两部分:数据(存放数据)和指针(指向下一元素)。
表尾结点:数据有效,but指针部分指向NULL。

动态链表:

正如上方介绍的从无到有开辟结点输入各结点的数据,结点的分配和回收都是动态的

静态链表:

将线性表中的元素存入数组。该元素也是能储存数据和指向下一元素------即所在数组单元的下标。(用游标来模拟指针)
代码实现静态链表的定义:

define Maxsize 10
typedef int Datatype
typedef struct SNode
{
	Datatype date;
	int next;//是滴,它是游标;
}Snode,Staticlist[Maxsize+1];

怎么使用单链表(简单操作)

单链表

注意事项
结点由于包括不同的类型的数据,因此使用结构体类型。
元素必须包括一个指向本结构体类型的指针。----定义即体现了递归

单链表的初始化

typedef stuct node{
	char name[20];
	int num;
	struct note *next;
}Node,*LinkList;

此处的Node,LinkList均为数据类型的别名;
单链表的初始化即创建一个头结点

LinkList InitList(){
	LinkList head;//头指针变量
	head=(Node*)malloc(sizeof(Node));
	head->next=Null;//指针指向下一个元素的地址
	return head;
}

当头结点的指针指向空指针时表示空链表;
建立链表
法1.尾插法
在单链表的尾部插入新结点

void CreatByRear(LinkList head){//CreatByRear函数功能是创建链表
	Node*r,*s;
	char name[20];
	int num;
	r=head;//指向头结点
	printf("请输入学生的姓名和学号:\n");
	while(1){
		scanf("%s",&name);
		scanf("%d",&num);
		if(nun==0)break;//学号为0跳出循环
		s=(Node*)malloc(sizeof(Node));//给新结点分配内存
		strcpy(s->name,name);//赋值
		s->num=num;//赋值
		r->nest=s;//原结点指向新结点
		r=s;//r指向新结点
	}
	r->next=NULL;//把尾结点的指针指向NULL
}

法2.头插法
在单链表的头部插入新结点

void CreatByRear(LinkList head){
	Node*r,*s;
	char name[20];
	int num;
	r->next=NULL;
	while(1){
		scanf("%s",&name);
		scanf("%d",&num);
		if(num==0)break;
		r=(Node*)malloc(sizeof(Node));//创建新结点
		strcpy(r->name,name);
		r->num=num;
		r->next=head->next;
		head->next=r;//头结点的指针域指向新结点
	}
}

单链表遍历
OutPut函数用于输出链表的数据;

void OutPut(LinkList){
	Node*p;
	p=head->next;//p指向首元结点
	while(p){
	printf("姓名是:%s\n",p->name);
	printf("学号是:%d\n\n",p->num);
	p=p->next;
	}
}

. . .
单链表的删除

//删除
void delete(Linklist head,int pos){
	printf("********要删除第%d的数*********\n",pos);
	Node*p=head,*q;
	int j=0;
	while(j<pos-1){
		p=p->next;
		j++;
	}//j=pos-1;此时的p为要删除的上一个 
	q=p->next;
	p->next=q->next;
	free(q); 
}

单链表的查询

//查询
Node* search(Linklist head,char name[]){
	Node*p=head->next;
	while(p){
		if(strcmp(p->name,name)!=0){
			p=p->next;
		}
		else break;
	}
	if(p==NULL)printf("没有找到%s的结点",name);
	return p;
} 

单链表的长度
从首元结点计数

//长度
int len(Linklist head){
	int cnt=0;
	Linklist p;
	p=head->next; 
	while(p){
		cnt++;
		p=p->next;
	}
	return cnt;
} 

欲知详情,请听下回分解
你怎么还不点赞收藏呀呜呜呜
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值