数据结构day4(2023.7.18)

news2024/11/25 18:32:41

一、Xmind整理:

链表的插入和删除:

二、课上练习:

练习1:顺序表去重

33  22  22  11   11 
        i    
            j
    for(int i=0;i<list->len-1;i++)
    {
         for(int j=i+1;j<len;j++)
         {
              if(list->data[i]==list->data[j])
              {
                   delete_by_sub(j,list);   
                   j--;  //防止漏删        
              }        
         }   
    }

练习2: 顺序表合并

/*
 * function:    顺序表有序合并
 * @param [ in] 
 * @param [out] 
 * @return      无
 */
void combine(Seqlist *la,Seqlist *lb,Seqlist *lc)
{
    int p=0;//la的下表
    int q=0;//lb的下表

    while(p<la->len && q<lb->len)
    {
    if(la->data[p] <=lb->data[q])
    {
        lc->data[lc->len++]=la->data[p++];
    }
    else
    {
        lc->data[lc->len++]=lb->data[q++];
    }
    }
    //吧la剩余元素存到lc
    while(p<la->len)
    {
        
    lc->data[lc->len++]=la->data[p++];
    }
    //吧lb剩余元素存到lc
    while(q<lb->len)
    {
    lc->data[lc->len++]=lb->data[q++];
    }

}

练习3: 单链表创建

/*
 * function:    创建一个节点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist create_node()
{
Linklist node=(Linklist)malloc(sizeof(struct Node));
    if(NULL==node)
    return NULL;
node->data=0;
node->next=NULL;
    return node;//0x10
}

练习4:单链表头插 

/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
Linklist insert_head(datatype e,Linklist L)
{
    //在堆区创建一个节点
Linklist node=create_node();
node->data=e;
node->next=L;
    L=node;
    return L;
}

练习5:单链表尾插 

/*
 * function:    尾插
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist insert_rear(datatype e,Linklist L)
{
    //创建一个新节点
Linklist s=create_node();
s->data=e;
    if(L==NULL)
    {
    L=s;
    }
    else
    {
    //rear指向最后一个节点的地址
    Linklist rear=L;
    while(rear->next!=NULL)
    {
        rear=rear->next;
    }
    rear->next=s;
    }
    return L;
}

练习6: 单链表头删

/*
 * function:    头删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_head(Linklist L)
{
    //判断链表是否为空
    if(NULL==L)
    {
    return L;
    }
    if(L->next==NULL)
    {
    free(L);
    L=NULL;
    }
    else
    {
    Linklist q=L->next;
    L->data=q->data;
    L->next=q->next;
    free(q);
    q=NULL;
    }
return L;
}

练习7: 单链表尾删

/*
 * function:    尾部删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_rear(Linklist L)
{
    //1,判断链表是否为空
    if(NULL==L)
    {
    return NULL;
    }
    //2,判断如果链表只有一个节点
    else if(L->next==NULL)
    {
    free(L);
    L=NULL;
    }
    else
    {
    //3,有多个节点
    //循环倒数第二个节点
    Linklist second=L;
    while(second->next->next!=NULL)
    {
        second=second->next;
    }
    free(second->next);
    second->next=NULL;
    }
    return L;
}

 练习8:单链表遍历

/*
 * function:    循环遍历
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
int output(Linklist L)
{
    //判断是否创建
    //判断是否为空
    if(NULL==L )
    {
    return -1;
    }
    while(L!=NULL)
    {
    printf("%d\t",L->data);
    L=L->next;
    }
    puts("");
}

 练习9:单链表任意位置插入

int Len_linklist(Linklist L)
{
    int count=0;
    while(L!=NULL)
    {
    count++;
    L=L->next;
    }
    return count;
}
/*
 * function:    按位置插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist insert_by_pos(int pos,datatype e,Linklist L)
{
    //1,判断链表是否为空
    //2,判断位置是否合法
    int len;
    if(NULL==L || pos<1 || pos>(len=Len_linklist(L))+1)
    {
    puts("insert arror");
    return L;
    }
    
    //3,插入
Linklist p=L;
    if(pos==len+1)
    {
    insert_rear(e,L);
    return L;
    }
    
    for(int i=1;i<pos;i++)
    {
    p=p->next;
    }
    
    
    //在p节点后面插入新节点s
Linklist s=create_node();
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
    
    
    return L;
}

 三、课后作业:

1.顺序表排序

test.c核心代码:
/*
 * function:    排序
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int SeqlistSort(Seqlist *list)
{
	int i,j,count;
	datatype t;
	if(NULL==list||empty(list))
		return -1;
	for(i=1;i<list->len;i++)
	{
		count=0;
		for(j=0;j<list->len-i;j++)
		{
			if(list->data[j]>list->data[j+1])
			{
				t=list->data[j];list->data[j]=list->data[j+1];list->data[j+1]=t;
				count++;
			}
		}
		if(count==0)
			break;
	}
	return 0;
}

2.单链表任意位置删除 

/*
 * function:    按链表位置删除
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
Linklist delete_by_pos(int pos,Linklist L)
{
	//1,判断链表是否为空
	//2.判断位置是是否合法
	int len;
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("delete error\n");
		return L;
	}
	if(pos==1)
	{
		delete_head(L);
	}
	else
	{
		//3.找到pos-1位置起名p
		Linklist p=L;
		for(int i=1;i<pos-1;i++)
		{
			p=p->next;
		}
		//4.删除p->next
		Linklist q=p->next;
		p->next=q->next;
		free(q);
		q=NULL;
	}
	return L;
}

3.单链表任意位置查找

/*
 * function:    按链表位置查找
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int search_by_pos(int pos,Linklist L)
{
	//1.判空
    int len=Len_linklist(L);
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("search error\n");
		return -1;
	}
	Linklist p=L;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("%d\n",p->data);
}

 4.单链表任意位置修改

/*
 * function:    按链表位置修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int update_by_pos(int pos,datatype e,Linklist L)
{
	int len=Len_linklist(L);
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("update error\n");
		return -1;
	}
	Linklist p=L;
	for(int i=1;i<pos;i++)
		p=p->next;
	p->data=e;
	return 0;
}

整体代码如下: 

head.h:

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef int datatype;
//定义单链表节点结构体
typedef struct Node
{
	//数据域:数据元素
	datatype data;
	//指针域:存储下一个节点的地址
	struct Node *next;	
}*Linklist;
Linklist create_node();
Linklist insert_head(datatype e,Linklist L);
int output(Linklist L);
Linklist insert_rear(datatype e,Linklist L);
Linklist delete_head(Linklist L);
Linklist delete_rear(Linklist L);
int Len_linklist(Linklist L);
Linklist insert_by_pos(int pos,datatype e,Linklist L);
Linklist delete_by_pos(int pos,Linklist L);
int search_by_pos(int pos,Linklist L);
int update_by_pos(int pos,datatype e,Linklist L);

#endif

test.c:

#include "head.h"
/*
 * function:    创建一个节点
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist create_node()
{
	Linklist node=(Linklist)malloc(sizeof(struct Node));
	if(NULL==node)
		return NULL;
	node->data=0;
	node->next=NULL;
	return node;
}
/*
 * function:    头插
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
Linklist insert_head(datatype e,Linklist L)
{
	//在堆区创建一个节点
	Linklist node=create_node();//在堆区申请一个节点
	node->data=e;//数据域赋值为e
	//node节点链接到链表中
	node->next=L;
	L=node;
	return L;//因为自定义函数指针的改变不影响实参,需要返回
}
/*
 * function:    循环遍历
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int output(Linklist L)
{
	//判断是否创建
	//判断是否为空
	if(NULL==L)
	{
		return -1;
	}
	while(L!=NULL)
	{
		printf("%d\t",L->data);
		L=L->next;
	}
	printf("\n");
}
/*
 * function:    尾部插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist insert_rear(datatype e,Linklist L)
{
	Linklist s=create_node();
	s->data=e;
	if(L==NULL)
	{
		L=s;
	}
	else
	{
		Linklist rear=L;
		while(rear->next!=NULL)
		{
			rear=rear->next;
		}
		rear->next=s;
	}
	return L;
}
/*
 * function:    头删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_head(Linklist L)
{
	//判断链表是否为空
	if(NULL==L)
	{
		return L;
	}
	if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		Linklist q=L->next;
		L->data=q->data;
		L->next=q->next;
		free(q);
		q=NULL;
	}
	return L;
}
/*
 * function:    尾部删除
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist delete_rear(Linklist L)
{
	//1.判断链表是否为空
	if(NULL==L)
	{
		return NULL;
	}
	//2.判断如果链表只有一个节点
	else if(L->next==NULL)
	{
		free(L);
		L=NULL;
	}
	else
	{
		//3.有多个节点
		//循环倒数第二个节点
		Linklist second=L;
		while(second->next->next!=NULL)
		{
			second=second->next;
		}
		free(second->next);
		second->next=NULL;
	}
	return L;
}
/*
 * function:    计算长度
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int Len_linklist(Linklist L)
{
	int count=0;
	while(L!=NULL)
	{
		count++;
		L=L->next;
	}
	return count;
}
/*
 * function:    按链表位置插入
 * @param [ in] 
 * @param [out] 
 * @return      
 */
Linklist insert_by_pos(int pos,datatype e,Linklist L)
{
	//1.判断链表是否为空
	//2.判断位置是否合法
	int len;
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("insert error\n");
		return L;
	}
	//3.插入
	Linklist p=L;
	if(pos==len+1)
	{
		insert_rear(e,L);
		return L;
	}
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	//在p节点后面插入新节点s
Linklist s=create_node();
s->next=p->next;
p->next=s;
s->data=p->data;
p->data=e;
return L;
}
/*
 * function:    按链表位置删除
 * @param [ in] 
 * @param [out] 
 * @return      成功返回0 失败返回-1
 */
Linklist delete_by_pos(int pos,Linklist L)
{
	//1,判断链表是否为空
	//2.判断位置是是否合法
	int len;
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("delete error\n");
		return L;
	}
	if(pos==1)
	{
		delete_head(L);
	}
	else
	{
		//3.找到pos-1位置起名p
		Linklist p=L;
		for(int i=1;i<pos-1;i++)
		{
			p=p->next;
		}
		//4.删除p->next
		Linklist q=p->next;
		p->next=q->next;
		free(q);
		q=NULL;
	}
	return L;
}
/*
 * function:    按链表位置查找
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int search_by_pos(int pos,Linklist L)
{
	//1.判空
    int len=Len_linklist(L);
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("search error\n");
		return -1;
	}
	Linklist p=L;
	for(int i=1;i<pos;i++)
	{
		p=p->next;
	}
	printf("%d\n",p->data);
}
/*
 * function:    按链表位置修改
 * @param [ in] 
 * @param [out] 
 * @return      
 */
int update_by_pos(int pos,datatype e,Linklist L)
{
	int len=Len_linklist(L);
	if(NULL==L||pos<1||pos>(len=Len_linklist(L))+1)
	{
		puts("update error\n");
		return -1;
	}
	Linklist p=L;
	for(int i=1;i<pos;i++)
		p=p->next;
	p->data=e;
	return 0;
}

main.c:

#include "head.h"
int main(int argc, const char *argv[])
{
	Linklist L=NULL;
	int n;
	datatype e;
	printf("please enter n:");
	scanf("%d",&n);
	/*
	for(int i=0;i<n;i++)
	{
		printf("please enter element:");
		scanf("%d",&e);
		//头插:在头指针当前节点插入
		L=insert_head(e,L);
	}
	*/

	//在主函数找到尾部节点
	Linklist rear=L;
	if(rear!=NULL)
	{
		while(rear->next!=NULL)
		{
			rear=rear->next;
		}
	}
	//尾部插入
	for(int i=0;i<n;i++)
	{
		printf("please enter element:");
		scanf("%d",&e);
	    L=insert_rear(e,L);
	}
	//循环链表
	output(L);
	//头删
	//L=delete_head(L);
	//output(L);
	//尾删
	//L=delete_rear(L);
	//output(L);

	//按链表位置插入
	int pos;
	printf("please enter insert pos:");
	scanf("%d",&pos);
	printf("please enter insert element:");
	scanf("%d",&e);
	L=insert_by_pos(pos,e,L);
	output(L);

	//按链表位置删除
	printf("please enter delete pos:");
	scanf("%d",&pos);
	L=delete_by_pos(pos,L);
	output(L);
	
	//按链表位置查找
	printf("please enter search pos:");
	scanf("%d",&pos);
	search_by_pos(pos,L);
	
	//按链表位置修改
	printf("please enter update pos:");
	scanf("%d",&pos);
	printf("please enter update element:");
	scanf("%d",&e);
	update_by_pos(pos,e,L);
	output(L);

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springmvc @RequestMapping注解中produces以及consumes属性的含义(转载请删除括号里的内容)

http协议基础知识 首先需要了解什么叫MediaType&#xff08;媒体类型&#xff09;&#xff1f; 通俗来说&#xff0c;在http协议中&#xff0c;用来表示传输内容的格式就是MediaType&#xff0c;比如text/html&#xff0c;application/json等&#xff0c;其中text代表介质&am…

win7系统电脑怎么在桌面上悬挂工作日程安排清单显示呢?

在现代快节奏的工作环境中&#xff0c;合理安排和管理工作日程是非常重要的。而在电脑桌面上悬挂工作日程安排清单显示&#xff0c;可以让我们随时了解自己的任务和工作进度&#xff0c;提高工作效率。那么&#xff0c;如何在Win7系统电脑上实现这一功能呢&#xff1f; 今天我…

第六章内存保护单元(Cortex-M7 Processor)

目录 第六章内存保护单元 6.1关于MPU 6.2MPU功能描述 6.3MPU编程器模型 第六章内存保护单元 介绍MPU (Memory Protection Unit)。它包含以下部分: 关于第6-2页的MPU。MPU功能描述见第6-3页。MPU程序员模型在第6-4页。 6.1关于MPU MPU是内存保护的可选组件。处理器支持标准…

【算法基础:数据结构】2.3 并查集

文章目录 并查集算法原理&#xff08;重要&#xff01;⭐&#xff09; 经典例题836. 合并集合&#xff08;重要&#xff01;模板&#xff01;⭐&#xff09;837. 连通块中点的数量&#xff08;维护连通块大小的并查集&#xff09;240. 食物链&#xff08;维护额外信息的并查集&…

【Spring | 应用上下文】

应用上下文 应用上下文和资源路径构造应用上下文构造ClassPathXmlApplicationContext实例 — 快捷方式使用通配符蚂蚁式图案类路径&#xff1a;前缀 应用上下文和资源路径 本节介绍如何使用资源创建应用程序上下文&#xff0c;包括使用 XML 的快捷方式、如何使用通配符以及其…

能耗管理平台保障用电的安全

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 6月12日&#xff0c;江苏盐城射阳县某民房起火&#xff0c;消防救援人员到场后&#xff0c;立即对火势进行扑救&#xff0c;经过20多分钟的处置&#xff0c;现场明火全部被扑灭&#xff0c;据了解&#xff0c;起火原因是电线老化短路引发…

Mac下makefile使用openssl库

程序报错 ./polipo.h:208:10: fatal error: openssl/ssl.h file not found 安装和查找openssl开发库 brew install brew --prefix openssl cd /opt/homebrew/opt/openssl3 cd lib cd pkgconfig 通过makefile配置include文件和lib文件 pkg-config方式 lib文件查找&#xf…

C# 同构字符串

205 同构字符串 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字符…

Mysql教程(五):DQL学习

Mysql教程&#xff08;五&#xff09;&#xff1a;DQL学习 DQL Data Query Language 数据查询语言&#xff0c;用来查询数据库中表的记录 1 基本语法 DQL查询语句&#xff0c;语法结构如下&#xff1a; SELECT字段列表 FROM表名列表 WHERE条件列表 GROUP BY分组字段列表 HAVI…

工时管理为何对项目如此重要?8Manage 带你读懂!

“时间就是金钱”&#xff0c;相信作为管理者都已经听腻了这话&#xff0c;但在项目管理中确实是真理。你要知道项目工时是会直接影响到项目费用成本的&#xff0c;不论项目工作是按小时还是按固定费用计费和付款&#xff0c;在一段工时内完成的工作越多&#xff0c;说明效率就…

myAgv的slam算法学习以及动态避障下篇

引言 在之前的一篇文章中有提到购入了一台myAGV&#xff0c;以树莓派4B为控制核心的移动机器人。上篇文章中向大家介绍了myAGV如何实现建图、导航以及静态避障&#xff0c;但我们深知&#xff0c;这只是机器人自主导航能力的基础。在实际应用场景中&#xff0c;机器人需要面对复…

【个人笔记】linux命令之ls

目录 Linux中一切皆文件ls命令常用参数常用命令lscpu lspci Linux中一切皆文件 理解参考&#xff1a;为什么说&#xff1a;Linux中一切皆文件&#xff1f; ls命令 ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容…

宝塔 30分钟部署免费在线客服系统

客服系统发布以来&#xff0c;一直有朋友询问如何在宝塔面板中安装部署&#xff0c;开始我一直认为参考 Linux 版的安装教程就可以了&#xff0c;一直没有专门写宝塔环境的教程。这段时间来咨询的朋友越来越多&#xff0c;经过了解&#xff0c;我才知道宝塔面板的普及率有多高&…

什么是Spring Actuator?它有什么优势?

目录 一、什么是Spring Actuator 二、Spring Actuator的应用场景 三、Spring Actuator的优势 一、什么是Spring Actuator Spring Actuator是Spring Boot提供的一个功能强大的管理和监控工具&#xff0c;用于监控和管理Spring Boot应用程序。它可以提供对应用程序的运行时信…

java实现身份证号码校验

二代身份证为18位&#xff0c;前六位为籍贯信息&#xff0c;7至14位为生日&#xff0c;最后一位校验前17位号码是否正确 校验规则为&#xff1a;前17位每一位乘以一个固定权重并相加然后除以11得到的余数&#xff0c;判断余数是否和校验的数相等 代码实现&#xff08;支持15位…

leetcode 9 回文数

class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int num x;int value 0;while(num > 0){value value * 10 num % 10;num num / 10;}return value x;} }

Enterprise:通过 App search 摄入数据

App Search 是 Elastic Enterprise Search 的一部分&#xff0c;Elastic Enterprise Search 是由 Elasticsearch 提供支持的内容搜索工具集合。 最初由 App Search 引入的一些功能&#xff08;例如网络爬虫&#xff09;现在可以直接通过企业搜索使用。 将这些功能与其他企业搜…

如何用DeepDiff测接口数据源变更?

开发同学最近变更了部分业务查询接口底层的数据源&#xff0c;希望测试同学能够针对这些接口进行一些回归验证&#xff0c;校验底层数据源更新前后业务查询接口返回的一致性&#xff0c;保证更新后对正常业务没有影响。 这个回归测试和一般接口测试有所区别&#xff0c;不仅仅…

混合背包(01+完全+多重背包大杂烩)

因为我们知道求解多重背包时&#xff0c;是将其进行二进制优化为01背包问题&#xff0c;那么我们就将01背包和多重背包看成一种情况&#xff0c;然后只要处理&#xff0c;完全背包和01背包问题即可&#xff08;详细看下方代码&#xff09; #include<bits/stdc.h> using n…

leetcode 965.单值二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;单值二叉树 思路&#xff1a; 让当前的根节点与左孩子节点与右孩子节点判断&#xff0c;若相等则继续向下分治&#xff0c;让左孩子与右孩子当作新的根节点继续判断&#xff0c;直到某个节点不相等。 1️⃣ 代码&#x…