单链表-乡巴老也能看懂

单链表-乡巴老也能看懂

链表
链表是一种物理存储单元上非连续非顺序的存储结构数据元素的逻辑
  顺序是通过链表中的指针链接次序实现的。链表由一系列节点(链表中没一个
   元素成为节点) 组成,节点可以在运行时动态生成。每个节点包括两个部分;
  一个时存储数据元素的数据域,另一个时存储下一个节点地址的指针域。
相比较的数组,链表结构与之有如下区别:
(1) 数组通常在创建的时候就需要设定数据的大小,使用链表结构可以
克服数组需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空
间,实现灵活的内存动态管理:
      (2) 链表由于增加了节点的指针域,空间开销比较大
      (3) 在中间插入或删除元素(节点)时,链表非常的灵活不需要移动
其他元素(节点)的位置:
      (4) 数组可以随机存储数据 , 但是链表不允许随机存取。

链表 (由多个节点组成,分散存储 由指针链接起来呢,)
节点组成(两部分:1数据域 2.指针域-存储下一个节点的指针)
节点1 节点2 节点3 节点4
数据  指针域 数据  指针域 数据  指针域 数据  指针域
 指向节点2 指向节点3 指向节点4  指向NULL
插入节点
节点1要插入节点
数据   指针域数据   指针域
直线新的节点            指针指向要插入位置后面节点的地址
最后他们组成了一个新的链表


方式1  头指针       头指针指向第一个数据节点
   head     =    NULL      需要判断 是否为空
方式2  头节点
   头节点   数据不使用     指针指向



//结构的数据类型
typedf struct Node{
	int data;
	struct Node*next;
}Node;
//链表类型
typedef struct List{
	Node *head;
}List;
//1创建节点
Noode* CreateNode (int data){
	Node *PtrNode = malloc(sizeof(Node));
	PtrNode->data = data;
	PtrNode->next = NULL;
	return PtrNode;
}
//2向头结点位置插入新结点、
void PushHead(List *list , int data){
	Node*PtrNew = CreateNode(data); //
	PtrNew->next =list->head;//如果链表有节点
	list->head = PtrNew ;//如果链表中无节点
	
}
//遍历链表
void tralve (List *list){
	printf("链表中的元素");
	Node *PtrHead= list->head;//操作是指针指向可以发生变化
	if(!PtrHead){
		put("空");
	}
	while(PtrHead){
		printf("%d",PtrHead->data);
		PtrHead = PtrHead->next;
	}
	printf("\n");
}
//4 计算结点个数
int length(List *list){
	int count =0;
	Node *PtrHead = list ->head;
	while(PtrHead){
		count++;
		PtrHead = PtrHead ->next;
	}
}
int main(){
	List list;
	list.head = NULL;//头指针
	PushHead(&list,1);
	tralve(&list);
	PushHead(&list,2);
	tralve(&list);
	PushHead(&list,3);
	tralve(&list);
	printf("length = %d\n",length(&list));
	return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DS单链表是一种线性数据结构,它由若干个节点组成,每个节点包括数据域和指针域,其中数据域用于存储数据,指针域用于指向下一个节点。DS单链表的存储结构如下: ``` typedef struct ListNode { int val; struct ListNode *next; } ListNode; ``` 其中,val表示节点存储的数据,next表示指向下一个节点的指针。 DS单链表的基本操作包括:创建、插入、删除、查找、遍历等。 1. 创建 创建DS单链表的方法有多种,例如头插法、尾插法等。其中,头插法的实现代码如下: ``` ListNode* createList(int arr[], int n) { ListNode *head = NULL; for (int i = 0; i < n; i++) { ListNode *node = (ListNode*)malloc(sizeof(ListNode)); node->val = arr[i]; node->next = head; head = node; } return head; } ``` 2. 插入 DS单链表的插入操作包括在指定位置插入节点和在末尾插入节点。其中,指定位置插入节点的实现代码如下: ``` void insert(ListNode *head, int val, int pos) { ListNode *node = (ListNode*)malloc(sizeof(ListNode)); node->val = val; ListNode *p = head; for (int i = 1; i < pos && p != NULL; i++) { p = p->next; } if (p == NULL) { return; } node->next = p->next; p->next = node; } ``` 3. 删除 DS单链表的删除操作包括删除指定位置的节点和删除指定值的节点。其中,删除指定位置的节点的实现代码如下: ``` void delete(ListNode *head, int pos) { ListNode *p = head; ListNode *q = NULL; for (int i = 1; i < pos && p != NULL; i++) { q = p; p = p->next; } if (p == NULL) { return; } if (q == NULL) { head = head->next; } else { q->next = p->next; } free(p); } ``` 4. 查找 DS单链表的查找操作包括查找指定位置的节点和查找指定值的节点。其中,查找指定值的节点的实现代码如下: ``` ListNode* find(ListNode *head, int val) { ListNode *p = head; while (p != NULL) { if (p->val == val) { return p; } p = p->next; } return NULL; } ``` 5. 遍历 DS单链表的遍历操作包括正向遍历和反向遍历。其中,正向遍历的实现代码如下: ``` void traverse(ListNode *head) { ListNode *p = head; while (p != NULL) { printf("%d ", p->val); p = p->next; } } ``` 以上就是DS单链表的存储结构与操作的介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

乡巴老来编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值