数据结构day5

m双向链表按位置删除

双向链表按位置修改

双向链表按位置查找

head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char datatype;
typedef struct Node
{
	//数据域
	union{
		int len;//头结点数据域:链表长度
		datatype data;//其他节点的数据域:数据元素
	};
	//指针域:下一个节点的地址
	struct Node *next;
	//指针域:上一个节点的地址
	struct Node *prev;
}*double_linklist;


int insert_pos(double_linklist L,int pos,datatype e);
int delete_rear(double_linklist L);
int delete_head(double_linklist L);
int insert_rear(double_linklist L,datatype e);
void output(double_linklist L);
double_linklist create(int flag);
int insert_head(double_linklist L,datatype e);
int delete_pos(double_linklist L,int pos);
int change_pos(double_linklist L,int pos2,datatype e);
int look_pos(double_linklist L,int pos);
#endif

main.c

    

	//按位置删除
	int pos1;
	printf("请输入删除的位置:\n");
	scanf("%d",&pos1);
	delete_pos(L,pos1);
	output(L);
	//按位置修改
	int pos2;
	printf("请输入修改的位置:\n");
	scanf("%d",&pos2);
	printf("请输入修改的数据元素:");
	scanf(" %c",&e);
	change_pos(L,pos2,e);
	output(L);
	//按位置查找
	int pos3;
	printf("请输入查找的位置:\n");
	scanf("%d",&pos3);
	look_pos(L,pos3);
	output(L);
	}

test.c
 

//按位置插入
/*	int pos;
	printf("请输入插入的位置:\n");
	scanf("%d",&pos);
	printf("请输入插入的数据元素:");
	scanf(" %c",&e);
	insert_pos(L,pos,e);
	output(L);
}
*/
	//按位置删除
	int pos1;
	printf("请输入删除的位置:\n");
	scanf("%d",&pos1);
	delete_pos(L,pos1);
	output(L);
	//按位置修改
	int pos2;
	printf("请输入修改的位置:\n");
	scanf("%d",&pos2);
	printf("请输入修改的数据元素:");
	scanf(" %c",&e);
	change_pos(L,pos2,e);
	output(L);
	//按位置查找
	int pos3;
	printf("请输入查找的位置:\n");
	scanf("%d",&pos3);
	look_pos(L,pos3);
	output(L);
	}

双向链表循环链表头插

双向链表循环链表头删

双向链表循环链表尾插

双向链表循环链表尾删

双向链表循环链表输出

head.h

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef float datatype;
typedef struct Node
{
union
{
int len;
datatype data;
};
struct Node *next;
struct Node *prev;
}*loop_double_linklist;


loop_double_linklist create(int flag);
int insert_head(loop_double_linklist L,datatype e);
int delete_head(loop_double_linklist L);
int output(loop_double_linklist L);
int insert_rear(loop_double_linklist L,datatype e);int delete_rear(loop_double_linklist L);

main.c

int main(int argc,char*argv[])
{
 	loop_double_linklist L=create(1);

	//双向循环链表头插
	int n;
	datatype e;
	printf("输入头插的个数:\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	printf("输入插入的小数:\n");
	scanf("%f",&e);
	insert_head(L,e);
	}

	//双向循环链表头删
	delete_head(L);
	
	
	//双向循环链表尾插
	int m;
	datatype k;
	printf("输入尾插的个数:\n");
	scanf("%d",&m);
	for(int i=0;i<m;i++)
	{
	printf("输入尾插的小数:\n");
	scanf("%f",&k);
	insert_rear(L,k);
	}

	//双向循环链表头删
	delete_rear(L);
	//输出
	output(L);

	return 0;
}

test.c

loop_double_linklist create(int flag)
{
loop_double_linklist L=(loop_double_linklist)malloc(sizeof(struct Node));
if(L==NULL)
{
return NULL;
}
if(flag==1)
{
L->len=0;
L->next=L;
L->prev=L;
}
if(flag==0)
{
L->data=0;
L->next=NULL;
L->prev=NULL;
}
return L;
}

//双向循环链表头插
int insert_head(loop_double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->next=L->next;
s->prev=L;
L->next->prev=s;
L->next=s;
L->len++;
return 0;
}

	//双向循环链表头删
int delete_head(loop_double_linklist L)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist q=L->next;
L->next=q->next;
q->next->prev=L;
L->len--;
free(q);
q=NULL;
return 0;
}

//输出
int output(loop_double_linklist L)
{
if(L==NULL||L->len==0)
{
return -1;
}
loop_double_linklist p=L;
while(p->next!=L)
{
p=p->next;
printf("%.2f ",p->data);
}
while(p->prev!=L->prev)
{
printf("%.2f ",p->data);
p=p->prev;

}
return 0;

}


	//双向循环链表尾插
int insert_rear(loop_double_linklist L,datatype e)
{
if(L==NULL)
{
return -1;
}
loop_double_linklist p=L;
while(p->next!=L)
{
p=p->next;
}
loop_double_linklist s=create(0);
if(s==NULL)
{
return -1;
}
s->data=e;
s->next=L;
s->prev=p;
p->next=s;
L->prev=s;
L->len++;
return 0;
}


	//双向循环链表头删
int delete_rear(loop_double_linklist L)
{
if(L==NULL||L->len==0)
{
return -1;
}

loop_double_linklist p=L->prev;
p->prev->next=L;
L->prev=p->prev;
free(p);
p=NULL;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值