C语言第十二天------------单向链表

顺序线性表:

数组来表达线性表(联系:1:1)
缺点:不能扩容,增加和删除麻烦
注:在结构中一般有指针来表达联系

struct list
{
	type data;
	int index;//下标
};		

ps:其实就是一个数组。。。。。不过逻辑上不是,逻辑和实际物理还是有区别

链表:

所有元素没有紧挨在一起,但每个元素有联系
有方向的链表:
单向链表

struct node
{
	data;//数据区
	struct node* next;地址
};

双向链表
循环链表:
单向循环链表
双向循环链表

插入节点的步骤:
	1、创建节点并填充内容
	2、修改关系

为了空间利用率提高,没有头节点,只是用一个指针变量在链表头,当需要修改头节点时,函数中需要用到二级指针

#include<stdio.h>
#include<stdbool.h> //主要宏定义   char->bool     0->false    1->true
#include<stdlib.h>  //malloc函数

typedef int dataType;
//定义节点类型
typedef struct Node
{
	dataType data;    //数据域
	struct Node* next;//指向域
}node,*pnode;

//增加
bool add(pnode* phead,int d)
{
	//1申请节点空间,并填充
	pnode pn=malloc(sizeof(node)/*Byte*/);
	if(NULL==pn)//申请节点失败
		return false;
	pn->data=d;
	//修改指向域
/*
	if(NULL==*phead)
	{
		//pn->next=*phead;
		//*phead=pn;
	}
	else
	{
		//pn->next=*phead;
		//*phead=pn;
	}
*/
	pn->next=*phead;
	*phead=pn;
	return true;
} 
//查找Key节点所在链表的位置
pnode  find(pnode ph,int key)
{
	while(NULL!=ph && ph->data!=key) 
		ph=ph->next;
	return ph;
}
//遍历
void list(pnode ph)
{
	while(NULL!=ph)
	{
		printf("%d ",ph->data);
		ph=ph->next;
	}
	printf("\n");
}
//修改节点元素内容
bool modify(pnode ph,int old,int nd)
{
	pnode pk=NULL;
	if((pk=find(ph,old))==NULL)
		return false;
	pk->data=nd;
	return true;
}
//倒置--递归
void rease(pnode* pphead,pnode first,pnode second,pnode third)
{	
	//如果second指向有元素,则修改指向域
	if(NULL!=second)
		second->next=first;
	//second为尾节点
	if(NULL==third)//将最后一个节点成为头节点
	{
		*pphead=second;
		return;
	}
	//递归
	rease(pphead,second,third,third->next);
}
//删除
bool drop(pnode* pphead,int key)
{	
	//ploc用于查找key所在元素位置,first key之前
	pnode first=NULL,ploc=*pphead;
	while(ploc!=NULL && ploc->data!=key)
	{
		first=ploc;
		ploc=ploc->next;
	}
	if(ploc==*pphead)//删除头节点
	{
		*pphead=ploc->next;
		free(ploc);
		return true;
	}
	else if(ploc!=NULL)//非头节点
	{
		first->next=ploc->next;
		free(ploc);
		return true;
	}
	return false;	
}
int main()
{
	//定义指针域:存储第一个节点的地址
	pnode head=NULL;
	//插入		
	add(&head,1);	
	add(&head,2);	
	add(&head,3);	
	add(&head,4);	
	list(head);
/*
	//查找
	if(find(head,4)!=NULL)
	{
		printf("1存在链表中\n");
	}	
	else
		printf("1不存在链表中\n");
	//修改
	//modify(head,2,100);
	//list(head);
*/
	//倒置---1,2为空,3指向头节点
	//rease(&head,NULL,NULL,head);	
	//list(head);
	drop(&head,4);
	list(head);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值