作业/2024/1/25

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;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值