作业/2024/1/25

本文详细介绍了如何在C语言中使用双向链表进行元素的头插、尾插,以及按任意位置插入和删除的操作,包括主函数示例和相关辅助函数的定义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.双向链表按任意位置插入

2.双向链表按照任意位置删除

主函数代码:

#include "head.h"

int main(int argc, const char *argv[])
{
	Doublelink head=NULL;
	int n;
	datatype element;
	printf("please enter n:");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	printf("please enter %d element:",i+1);

	scanf(" %c",&element);
//	head=insert_head(head,element);//头插
	head=insert_rear(head,element);//尾插
	}
//	head=delete_head(head);
//	head=delete_rear(head);
//
//
//
//
//	int len=length_Doublelink(head);//计算双向链表位置长度
//	printf("%d\n",len);
//
//
//



/*	
	datatype key;//按照元素查找位置
	printf("key=:");
	scanf(" %c",&key);
	find_key(head,key);
*/	
	
	
/*	
	output(head);
	datatype element;
	printf("please enter element you want");
	scanf(" %c",&element);
	int pos;
	printf("please enter pos you want");
	scanf("%d",&pos);
	insert_pos(head,pos,element);
*/


/*	output(head);按照任意位置删除
	int pos;
	printf("please enter element you want:");
	scanf(" %c",&element);
	printf("please enter pos you want insert:");
	scanf("%d",&pos);
	head=insert_pos_element(head,pos,element);
	output(head);*/

	output(head);
	int pos;
	printf("please enter pos you want delete:");
	scanf("%d",&pos);
	head=delete_pos(head,pos);
	output(head);
	
	

	return 0;
}

head.h

#ifndef _HEAD_H_
#define _HEAD_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
//定义双向链表
typedef char datatype;

typedef struct Node
{
	datatype data;//定义存储元素
	struct Node *next;//定义下一个节点地址
	struct Node *prev;//定义上一个节点地址
}*Doublelink;



Doublelink insert_head(Doublelink head,datatype element);

Doublelink output(Doublelink head);

Doublelink insert_rear(Doublelink head,datatype element);

Doublelink delete_head(Doublelink head);

Doublelink delete_rear(Doublelink head);

int  length_Doublelink(Doublelink head);//计算双向链表长度的函数

int find_key(Doublelink head,int key);//输入位元素查找到相同元素的位置

Doublelink insert_pos_element(Doublelink head,int pos,datatype element);

Doublelink delete_pos(Doublelink head,int pos);
#endif

test.c

#include "head.h"

//创建
Doublelink create()
{
	Doublelink s=(Doublelink)malloc(sizeof(struct Node));
	if(s==NULL)
		return NULL;

	s->data=0;
	s->next=s->prev=s;
	return s;	

	

}

//头插
Doublelink insert_head(Doublelink head,datatype element)
{
	Doublelink s=create();
	s->data=element;

	if(NULL==head)
		head=s;
	
	else 
	{
	Doublelink rear=head->prev;
	s->next=head;
	head->prev=s;
	head=s;
	head->prev=rear;
	rear->next=head;
	}
	return head;
}

//循环输出
Doublelink output(Doublelink head)
{
	if(NULL == head)
	{
		puts("empty");
		return head;
	}

	else
	{
	Doublelink p=head;
	while(p->next!=head)
	{
	printf("%-5c",p->data);
	p=p->next;
	}
	printf("%-5c\n",p->data);



	do
	{
	printf("%-5c",p->data);
	p=p->prev;
	}while(p!=head->prev);
	puts("");
	}

}
//尾部插入
Doublelink insert_rear(Doublelink head,datatype element)
{
	Doublelink s=create();
	s->data=element;

	if(NULL==head)
		head=s;
	

	else
	{

	Doublelink p=head->prev;
	p->next=s;
	s->prev=p;
	s->next=head;
	head->prev=s;
	}
	return head;	
}

//头删
Doublelink delete_head(Doublelink head)
{
	if(head==NULL)
		return head;
	if(head->next==head)
	{
	free(head);
	head=NULL;
	return head;
	}
	
	
	Doublelink rear=head->prev;
	Doublelink del=head;
	head=head->next;
	head->prev=rear;
	rear->next=head;
	free(del);
	del=NULL;
	return head;
	

}

//尾删
Doublelink delete_rear(Doublelink head)
{
	if(head==NULL)
		return head;
	 if(head->next==head)
	{
	free(head);
	head=NULL;
	return head;
	}
	else
	{
		Doublelink p=head->prev;
						
		p->prev->next=head;
		head->prev=p->prev;
		free(p);
			p=NULL;
	return head;
	}

}
//定义双向链表长度位置的函数
int length_Doublelink(Doublelink  head)
{
	int len=0;
	Doublelink p=head;
	while(p->next!=head)
	{
	len++;
	p=p->next;
	}
	return len+1;
}
//定义按照所给的元素查找位置
int find_key(Doublelink head,int key)
{
	if(head==NULL)
		return 0;

	int len=length_Doublelink(head);
	Doublelink p=head;
	for(int i=1;i<=len;i++)
	{
		if(p->data==key)
		{
			printf("position(%d)=key\n",i);
			//return i;
		}
		p=p->next;
	}

}


//双向链表按任意位置插入
Doublelink insert_pos_element(Doublelink head,int pos,datatype element)
{
	if(pos<1||pos>length_Doublelink(head)+1)
	{
		puts("position ERROR");
		return head;
	}


	Doublelink s=create();
	s->data=element;



	if(pos==1)
	{
	head=insert_head(head,element);
	return head;
	}

	Doublelink p=head;
	for(int i=1;i<pos-1;i++)//i<pos-1表示一个过程让p和pos-1位置一样;
	{
		p=p->next;
	}
	s->prev=p;
	s->next=p->next;

	p->next->prev=s;
	p->next=s;

	return head;
}




//双向链表按照任意位置删除
Doublelink delete_pos(Doublelink head,int pos)
{
	if(pos<1||pos>length_Doublelink(head))
	{
		puts("ERROR");
	}
	if(head==NULL)//链表为空返回null
		{
		 return head;
		}
	if(pos==1)
	{
		delete_head;
		return head;
	}

	Doublelink p=head;
	for(int i=1;i<pos-1;i++)
	{
		p=p->next;
	}

	Doublelink del=p->next;
	p->next=del->next;
	del->next->prev=p;
	free(del);
	del=NULL;
	return head;

}

### 关于鸿蒙移动开发期末作业的示例代码与项目主题 #### 项目主题建议 以下是几个适合鸿蒙移动开发的期末作业项目主题: 1. **健康管理类应用** 借鉴“黑马健康”项目的思路[^1],可以创建一个健康管理应用程序。功能模块可包括每日饮食记录、运动计划跟踪、睡眠质量分析等。 2. **底部弹出面板交互设计** 参考底部弹出面板的设计[^2],实现一个动态显示的食物详情界面。通过点击事件触发弹窗展示营养成分表或其他相关信息。 3. **Tab切换效果优化** 使用`Row()`和`ForEach()`方法构建自定义标签栏[^3],提供更灵活的页面导航体验。此方案适用于多页面结构的应用程序。 4. **欢迎页动画制作** 结合图像资源文件夹中的素材[$r('app.media.*')]配置视觉吸引人的启动画面[^4]。加入简单的过渡动画提升用户体验感。 #### 示例代码分享 ##### 动态生成指示器样式的例子 下面是一段基于循环渲染不同样式圆点来表示当前位置的功能片段: ```javascript build() { Row({ space: 5 }) { ForEach(this.indexAll, (item) => { if(item){ Row() .width(45) .height(17) .borderRadius(20) .backgroundColor('#fbc955') .borderStyle(BorderStyle.Solid) .borderColor('#fbc955'); }else{ Row() .width(20) .height(17) .borderRadius(20) .backgroundColor('#fff') .borderStyle(BorderStyle.Solid) .borderColor('#fbc955') .borderWidth(3); } }) }; } ``` ##### 创建带时间戳头部区域的方法 这里展示了如何建立包含日期信息的小部件: ```javascript ItemPanelHeader(){ Text('2024125日 早晨') .textAlign(TextAlign.Center); } ItemCard(props){ Column({ Image().src(fixedImageSource); // 替换为实际路径 Text(`${props.foodName}`) .underline(); Divider(); NutrientInfo(label:'卡路里', value:`${props.calories}`); @Prop amount; Text(`数量:${this.amount}`); }); } ``` ##### 主页布局实例 这是另一个完整的主页设计方案,包含了logo放置位置调整等功能说明: ```javascript build() { Column({ space: 10 }) { Row() { Image($r('app.media.home_slogan')) .width(260); }.layoutWeight(1); Image($r('app.media.home_logo')) .width(150); Row() { Text('黑马健康支持').opacityWhiteText(0.8, 12); Text('IPv6') .opacityWhiteText(0.8) .border({style:BorderStyle.Solid,width:1,color:Color.White,radius:15}) .padding({left:5,right:5}); Text('网络').opacityWhiteText(0.8,12); }; Text("'减更多'指黑马健康App希望通过软件工具的形式,帮助更多用户实现身材管理").opacityWhiteText(0.6); Text('浙ICP备0000000号-36D').opacityWhiteText(0.4).margin({bottom:35}); } .width('100%') .height('100%') .backgroundColor($r('app.color.welcome_page_background')); }; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值