双链表操作

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

typedef struct dnode
{
	char data;
	struct dnode *prior;
	struct dnode *next;
}dLinkList;

//创建双链表,包括没有数据Data的头结点
dLinkList* create_link()
{
	dLinkList *p,*q;
	dLinkList* list = (dLinkList*)malloc(sizeof(dLinkList));
	(list)->data = '\0';
	(list)->prior = NULL;
	(list)->next = NULL;

	p = list;//将头结点的地址给p
	char ch;
	printf("input element:");
	while((ch = getchar())!='\n')//ch = getchar()
	{
		q = (dLinkList*)malloc(sizeof(dLinkList));
		q->data = ch;
		q->next = NULL;
		q->prior = p;
		p->next = q;

		p = q;
	}

	return list;
}

//查找:根据位置查找结点,查找位置为n处的结点并返回指针
dLinkList *find_by_pos(dLinkList *list,int n)
{
	dLinkList *p = list->next;
	int i=1;

	while(p && i<n)
	{
		p=p->next;
		i++;
	}

	if(p==NULL || i>n)
	{
		printf("find error!\n");
		return NULL;
	}

	return p;
}

//查找:根据数据元素查找,查找数据元素为ch的结点并返回指针
dLinkList *find_by_val(dLinkList *list,char ch)
{
	dLinkList *p = list->next;

	while(p && p->data!=ch)
	{
		p = p->next;
	}

	if(p == NULL)
	{
		printf("find error!\n");
		return NULL;
	}

	return p;
}

//插入结点:在链表list位置n处插入元素
void insert_val(dLinkList *list,int n,char ch)
{
	dLinkList *p;//链表位置n处的结点
	dLinkList *q;//新的结点,内有元素ch
	p = find_by_pos(list,n);
	if(p == NULL)
	{
		printf("insert error!\n");
		return;
	}

	q = (dLinkList*)malloc(sizeof(dLinkList));
	q->data = ch;

	q->prior = p->prior;
	p->prior->next = q;
	q->next = p;
	p->prior = q;
}

//删除结点:删除链表list位置n处的结点
void delete_list(dLinkList *list,int n)
{
	dLinkList *p,*q;
	p = find_by_pos(list,n);

	q = p->prior;
	if(p==NULL || q==NULL)
	{
		printf("delete error!\n");
		return;
	}

	q->next = p->next;
	p->next->prior = q;
	free(p);

}

//遍历链表
void traverse_list(dLinkList *list)
{
	dLinkList *p = list->next;
	if(p==NULL)
	{
		printf("no elements\n");
	}

	while(p!=NULL)
	{
		printf("%c",p->data);
		p = p->next;
	}

	printf("\n");
}
int main()
{
	dLinkList *list,*p;
	list = create_link();
	traverse_list(list);
	//查找:按位置
	p = find_by_pos(list,5);
	printf("position 5 elements:%c\n",p->data);

	//查找:按数据元素
	p = find_by_val(list,'r');
	if(p)
	{
		printf("f element:%c\n",p->data);
	}

	//插入结点
	insert_val(list,5,'Q');
	traverse_list(list);

	//删除结点
	delete_list(list,3);
	traverse_list(list);

	system("pause");
	return 0;

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值