嵌入式学习-数据结构-Day4

嵌入式学习-数据结构-Day4

一、思维导图

在这里插入图片描述

二、作业

1.单向链表任意元素查找

2.单向链表任意元素修改

3.单向链表任意元素删除

4.单向链表逆置

5.单向链表查找倒数第n个节点

6.单向链表排序

7.单向链表释放内存

主函数部分

#include "head.h"

int main(int argc, const char *argv[])
{
	Linklist head=NULL;//定义 头指针
	datatype element,element1;
	int n,pos;

	printf("please enter n:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		printf("please enter %d element:",i+1);
		scanf("%d",&element);
		//head=insert_head(head,element);  //头插
		head=insert_rear(head,element);    //尾插
	}

	Output(head);
	
//	head=del_head(head);   //头删
//	Output(head);
	
//	head=del_rear(head);   //尾删
//	Output(head);

/*	printf("please enter insert pos:");//根据位置插入
	scanf("%d",&pos);
	printf("please enter insert element:");
	scanf("%d",&element);
	head=insert_pos(head,pos,element);
	Output(head);


	printf("please enter delete pos:");//根据位置删除
	scanf("%d",&pos);
	head=del_pos(head,pos);
	Output(head);
	
	printf("please enter find pos:");//根据位置查找
	scanf("%d",&pos);
	find_pos(head,pos);
	
	printf("please enter change pos:");//根据位置查找修改
	scanf("%d",&pos);
	printf("please enter chang element:");
	scanf("%d",&element);
	change_pos(head,pos,element);
	Output(head);
*/	
	
	printf("please enter find element:");//根据元素查找
	scanf("%d",&element);
	find_element(head,element);

	printf("please enter change element:");//根据元素查找修改
	scanf("%d",&element);
	printf("please enter chang element:");
	scanf("%d",&element1);
	change_element(head,element,element1);


	printf("please enter delete element:");//根据元素查找删除
	scanf("%d",&element);
	head=del_element(head,element);

	head=reverse_list(head);   //链表逆置

	printf("please enter the pos from back:");//查找倒数第n个节点
	scanf("%d",&pos);
	find_back_pos(head,pos);

	Bubble(head);//冒泡排序

	head=free_space(head);//释放内存
	return 0;
}

相关函数

#include "head.h"
//创建节点
Linklist create_node()
{
	Linklist p=(Linklist)malloc(sizeof(struct Node));
	if(NULL==p)
		return NULL;
	p->data=0;   //数据域和指针域要初始化
	p->next=NULL;
	return p;
}
//头插
Linklist insert_head(Linklist head ,datatype element)
{
	Linklist s=create_node(); //创建节点s
	if(NULL==s)
		return head;
	s->data=element;

	s->next=head;  
	head=s;       //将head换到s位置,逆序
	return head;  //返回head

}
//尾插
Linklist insert_rear(Linklist head,datatype element)
{
	Linklist s=create_node(); //创建节点
	s->data=element;
	if(head==NULL)
		head=s;
	else
	{
		Linklist p=head;
		while(p->next!=NULL)//找到最后一个节点
			p=p->next;
		p->next=s;  //连接s  正序
	}
	return head;
}
//头删
Linklist del_head(Linklist head)
{
	if(NULL==head)
		return head;
	//printf("delete from head\n");
	Linklist del=head;
	head=head->next;
	free(del);
	del=NULL;
	return head;
}
//尾删
Linklist del_rear(Linklist head)
{
	if(NULL==head)
		return head;
	else if(head->next==NULL)//只有一个长度
	{
		free(head);
		head=NULL;
		return head;
	}
	else
	{
		Linklist p=head;
		while(p->next->next!=NULL)
			p=p->next;
		free(p->next);
		p->next=NULL;
		return head;
	}
}
//输出
void Output(Linklist head)
{
	if(NULL==head)
	{
		printf("Linklist is EMPTY\n");
		return;
	}
	Linklist p=head;
	printf("the Output is: ");
	while(p!=NULL)
	{
		printf("%d  ",p->data);
		p=p->next;
	}
	puts("");
}
//计算长度
int len_linklist(Linklist head)
{
	if(NULL==head)
	{
		printf("LEN IS ZERO\n");
		return FALSE;
	}
	Linklist p=head;
	int count=0;
	while(p!=NULL)
	{
		p=p->next;
		count++;
	}
	return count;
}
//根据位置插入***
Linklist insert_pos(Linklist head,int pos,datatype element)
{
	if(pos<1||pos>len_linklist(head)+1)//在len位置和len+1位置都可以插入
	{
		puts("ERROR\n");
		return head;
	}
	if(pos==1)  
	{
		head=insert_head(head,element);  // 调用头插
		return head;
	}
	Linklist p=head;                
	for(int i=1;i<pos-1;i++)
		p=p->next;
	Linklist s=create_node();
	if(NULL==s)
		return head;
	s->data=element;  //存储数据
	s->next=p->next;  //插入
	p->next=s;
	return head;
}

//根据位置删除***
Linklist del_pos(Linklist head,int pos)
{
	if(NULL==head||pos<1||pos>len_linklist(head))
		return head;
	if(pos==1)  //第一个位置头删
	head=del_head(head);
	else        //不是第一个位置
	{
		Linklist p=head;
		for(int i=1;i<pos-1;i++)   //找到pos-1
			p=p->next;  
		Linklist del=p->next;  //找到删除位置
		p->next=del->next;     //连接
		free(del);
		del=NULL;
		return head;
	}

}

//根据位置查找
void find_pos(Linklist head,int pos)
{
	if(NULL==head||pos<1||pos>len_linklist(head))
	{	
		puts("ERROR\n");
		return;
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("find:%d\n",p->data);
}
//根据位置查找修改 
void change_pos(Linklist head,int pos,datatype element)
{
	if(NULL==head||pos<1||pos>len_linklist(head))
	{	
		puts("ERROR\n");
		return;
	}
	Linklist p=head;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	p->data=element;
}

//根据元素查找 输出下标
void find_element(Linklist head,datatype element)
{
	if(NULL==head)
		return;
	Linklist p=head;
	int count=1,flag=0;
	while(p!=NULL)
	{
		if(p->data==element)
		{
			flag=1;
			printf("find SUCCESS! index is %d\n",count);
		}
		count++;
		p=p->next;
	}
	if(flag==0)
		printf("element is NOT EXIST\n");
}

//根据元素查找修改
void change_element(Linklist head,datatype element,datatype element1)
{
	if(NULL==head)
		return;
	Linklist p=head;
	int flag=0;
	while(p!=NULL)
	{
		if(p->data==element)
		{
			flag=1;
			p->data=element1;
		}
		p=p->next;
	}
	if(flag==1)
	{
		printf("modify SUCCESS\n");
		Output(head);
	}
	if(flag==0)
		printf("modify FAIL\n");
		
}

//根据元素查找删除 (删不掉重复)
Linklist del_element(Linklist head,datatype element)
{
	if(NULL==head)
		return head;
	Linklist p=head;
	int flag=0,pos=1;
	while(p!=NULL)
	{
		if(p->data==element)
		{
			flag=1;
			head=del_pos(head,pos);
		}
		p=p->next;
		pos++;
	}
	if(flag==0)
		printf("element NOT EXIST\n");
	if(flag==1)
		Output(head);
	return head;
}

//***链表逆置***
Linklist reverse_list(Linklist head)
{
	if(NULL==head)
		return head;
	if(head->next==NULL)
	{
		printf("element only one\n");
		return head;
	}
	Linklist p;
	p=head->next;
	head->next=NULL;  //断开头
	while(p != NULL )
	{
		Linklist t=p;//利用t连接断开的head***
		p=p->next;//p前进
		t->next=head;
		head=t;//把head给t
	}
	printf("reverse!\n");
	Output(head);	
	return head;
}
//查找倒数第n个节点
void find_back_pos(Linklist head,int pos)
{
	int len=len_linklist(head);
	if(NULL==head||pos<0||pos>len)
		return;
	Linklist p,q;//定义两个变量
	p=q=head;
	for(int i=0;i<pos;i++)
		p=p->next;
	while(p!=NULL)
	{
		p=p->next;
		q=q->next;
	}
	printf("element is %d\n",q->data);
}

//链表排序-冒泡
void Bubble(Linklist head)
{
	if(NULL==head)
		return;
	Linklist p=head;
	int len=len_linklist(head);
	for(int i=1;i<len;i++)
	{
		p=head;// p从头开始
		for(int j=0;j<len-i;j++)
		{
			if(p->data > p->next->data)
			{
				datatype t=p->data;
				p->data=p->next->data;
				p->next->data=t;
			}
			p=p->next;//p前进
		}
	}
	printf("bubble\n");
	Output(head);
}

/*链表排序-简单选择
void easyselect(Linklist head)
{
}*/

//释放内存
Linklist free_space(Linklist head)
{
	if(NULL==head)
		return NULL;
	while(head!=NULL)
		head=del_head(head);
	return head;
	
}
//删除元素(删重复)
void del2_element(Linklist head,datatype element)
{
	if(NULL==head)
		return;
	Linklist p=head;
	Linklist q=head;
	int flag=0,pos=1,flag1=0;
	while(p!=NULL)
	{
		flag1=0;
		if(p->data==element)
		{
			flag=1;
			flag1=1;
			head=del_pos(head,pos);
			for(int i=0;i<pos-1;i++)
				q=q->next;
		}
		if(flag1==1)
		{p=q;}
		else
		{p=p->next;pos++;}
	}
	if(flag==0)
		printf("element NOT EXIST\n");
	if(flag==1)
		Output(head);
}


头文件

#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum{FALSE=-1,SUCCESS};
typedef int datatype;
typedef struct Node //创建节点结构体
{
	datatype data;//数据域

	struct Node *next;//指针域

}*Linklist;

Linklist create_node();
Linklist insert_head(Linklist head ,datatype element);
void Output(Linklist head);
Linklist insert_rear(Linklist head,datatype element);
Linklist del_head(Linklist head);
Linklist del_rear(Linklist head);
int len_linklist(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist del_pos(Linklist head,int pos);
void find_pos(Linklist head,int pos);
void change_pos(Linklist head,int pos,datatype element);
void find_element(Linklist head,datatype element);// 以下是作业所用的函数
void change_element(Linklist head,datatype element,datatype element1);
Linklist del_element(Linklist head,datatype element);
Linklist reverse_list(Linklist head);
void find_back_pos(Linklist head,int pos);
void Bubble(Linklist head);
Linklist free_space(Linklist head);

#endif

运行结果

在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值