线性表 (C语言实现一个单链表) ------- 算法笔记001

单链表的综合运用

实现函数:
1.一个链表的创建
2.链表的插入删除
3.查看链表总数与快慢指针实现快速查找链表的中间值

链表创建过程:

	第一步:定义结构
typedef struct structBody/*结构体类名*/{
	ElemType data;	// 定义你的结构体数据,ElemType是你自定义的数据类型如:typedef int ElemType
	struct structBody *next;//定义指向下一个结构体的指针
}Alias //别名
第二步:根据输入的数据动态生成一个链表
void CreateList(Alias **list){
		if(!(*list)){
			(*list)=(Alias *)malloc(sizeof(Alias));	
			//判断二级指针地址的内容是否为空。这样做的好处是传的是指针的指针地址,就不需要返回指针类型了。
		}
		char ch;
		Alias *p=(*list);
		scanf("%c",&ch);
		while(ch!='\0'){
		//下面的这几步是固定操作,尾插法创建。
			Alias * newlist=(Alias *)malloc(sizeof(Alias));
			newlist->data=ch;
			newlist->next=NULL;
			p->next=newlist;
			p=newList;
			scanf("%c",&ch);
		}
		p=(*list);
		(*list)=(*list)->next;//删除头结点
		free(p);
		
}

链表的插入和删除原理:

插入原理:

有好几种插入的方法这里我们的插入函数的格式是,给定要插入的位置和数据,实现一个插入过程。
那么就是一个寻找到指定位置的节点,比如说第二个节点。那我们找到第二个位置前的节点,然后进行改动next指针操作。步骤是将新节点的next指针指向指定位置的节点;然后将第二个位置前的节点next指针指向新节点。

删除原理:

就是不停的进行迭代操作,直到指针p指向了NULL,每次操作free掉一个节点。

	void InsertList(Alias **list,ElemType data,unsigned int position){
		Alias *newInsert=(Alias *)malloc(sizeof(Alias));
		Alias *p=(*list);
		newInsert->data=data;
		position-=2;
		while(position){
			p=p->next;
			position--;
		}
		if(p==(*list)){
			//在第一个元素插入
			newInsert->next=p;
			(*list)=newInsert;
		}else if(p->next=NULL){
			return;
		}else{
			newInsert->next=p->next;
			p->next=newInsert;
		}
	}
//代码每个人有每个人的风格特点,但是思维是不变的,要按着思维写程序,不要纠结代码,我的代码也仅做参考。

void deleteList(Alias **list){
	Alias *p=(*list);
	while(p){
		Alias *dellist=p;
		p=p->next;
		free(dellist);
 	}
}

快慢指针查找中间节点:

思路就是定义一个快指针,每次循环走两个节点,一个慢指针,每次循环走一个节点,当快指针走到末尾时由于走的步数是一样的但慢指针走的是快指针的二分之一,所以慢指针这是=时也正好处于中间位置。

	void findeMiddleNode(Alias **list){
		Alias *fast=(*list);
		Alias *slow=(*list);
		while(fast->next->next){
			fast=fast->next->next;
			slow=slow->next;
			if(fast->next==NULL)
				break;
	}
	printf("\n");
	printf("---------------查找中间数据-------------------\n"); 
	if(fast->next){
		printf("中间的数据是:%d或者%d",slow->data,slow->next->data);
		return;
	}
	printf("中间的数据是:%d\n\n",slow->data);
	}
	

	源程序我上传到了我的资源上,是dev c++工程 有兴趣的可以下载具体研究一下,也挺有趣的。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智者_若愚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值