双向链表

#include<stdio.h>
#include<stdlib.h>

typedef struct link
{
	int date;
	struct link *pre;
	struct link *next;
}Node,*NODE;

NODE creat()
{
	NODE p;
	p=(NODE)malloc(sizeof(Node));
	p->next=NULL;
	p->pre=NULL;
}

void listlink(NODE l,int n)
{
	NODE p,q;
	int i,m;
	p=creat();
	l->next = p;
	scanf("%d",&m);
	p->date=m; 
	for(i=1;i<n;i++)
	{
		scanf("%d",&m);
		q=(NODE)malloc(sizeof(Node));
		q->date=m;
		q->pre=p;
		q->next=p->next;
		p->next=q;
		p=q; 
	}
}
//链表删除,注意尾节点删除 
void ListDelete(NODE *L,int i,int *e)
{
	NODE p,q;
	p=*L;
	int j=1;
	while(j<i&&p)
	{
		p=p->next;
		j++;
	} 
	q=p->next;
	*e=q->date;
	if(q->next)
	{
		q->next->pre = p;
		p->next=q->next;
		free(q);
	}
	else
	{
		p->next=NULL;
		free(q);
	}
}
//链表插入,在第i个元素之前插入元素e 
void ListInsert(NODE *L,int i,int e)
{
	NODE p,q;
	p=creat();
	p->date=e;
	q=*L;
	int j=1;
	while(j<i&&q)
	{
		q=q->next;
		j++;
	}
	p->next=q->next;
	q->next->pre=p;
	q->next=p;
	p->pre=q;
}
//链表查找 
void LocateElem(NODE l,int *e,int n)
{
	NODE p;
	int i=1;
	p=l->next;
	while(p)
	{
		if(p->date==n)
		{
			*e=i;
			break;
		}
		p=p->next;
		i++;
	} 
}

void ListChange(NODE l,int oldelem)
{
	NODE p;
	p=l->next;
	while(p->date!=oldelem&&p)
		p=p->next;
	if(p->date==oldelem)
	{
		printf("请输入将%d修改为:",oldelem);
		scanf("%d",&p->date);
	}
	else
		printf("没有找到需要修改的元素");
} 
void PRINTF(NODE l)
{
	NODE p;
	p=l->next;
	while(p)
	{
		printf("%d ",p->date);
		p=p->next;	
	}
}

int main()
{
	NODE l;
	l=creat();
	int n;
	printf("请输入要建立的链表元素的个数:");
	scanf("%d",&n);
	printf("请输入链表元素\n"); 
	listlink(l, n);
	PRINTF(l);
	
	printf("\n"); 
	printf("请输入要删除元素的位置");
	scanf("%d",&n);
	ListDelete(&l,n,&n);
	printf("取出的数为%d\n",n);
	PRINTF(l);
	
	printf("\n");
	printf("请输入要插入元素的位置:");
	scanf("%d",&n);
	ListInsert(&l,n,100);
	PRINTF(l);
	
	printf("\n");
	printf("请输入要查找的数:");
	scanf("%d",&n); 
	LocateElem(l,&n,n);
	printf("它在链表中的位置为%d",n);
	
	printf("\n");
	printf("请输入要修改的元素");
	scanf("%d",&n);
	ListChange(l,n);
	PRINTF(l);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值