数据结构-双向链表

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

typedef struct DoubleLinkedNode
{
	char data;
	struct DoubleLinkedNode *previous;
	struct DoubleLinkedNode *next;
	//创建含有一个数据域,两个指针域的结构体 
} DLNode,*DLNodePtr;


DLNodePtr initLinkList()//链表头节点的创建与初始化 
{
	DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
	tempHeader->data ='\0';
	tempHeader->previous =NULL;
	tempHeader->next =NULL;
	
	return tempHeader;//返回头节点的地址 
}

void printList(DLNodePtr paraHeader)
{
	DLNodePtr p=paraHeader->next ;
	
	while(p!=NULL)
	{
		printf("%c",p->data );
		p=p->next ;
	}
	printf("\r\n");
}

void insertElement(DLNodePtr paraHeader,char paraChar,int paraPosition)
{
	DLNodePtr p,q,r;
	
	p=paraHeader;
	for(int i=0;i<paraPosition;i++)
	{
		p=p->next ;
		if(p==NULL)
		{
			printf("The position %d is beyond the scope of the list.", paraPosition);
			return;
		}
	}
	
	q=(DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
	q->data =paraChar;
	
	//插入元素 
	r=p->next ;
	q->next =r ;
	q->previous =p;
	p->next =q;
	
	if(r!=NULL)
	{
		r->previous =q;
	}
}

void deleteElement(DLNodePtr paraHeader,char paraChar)
{
	DLNodePtr p,q,r;
	p=paraHeader;
	
	while((p->next !=NULL)&&(p->next->data !=paraChar))
	{
		p=p->next ;
	}
	
	if(p->next ==NULL)
	{
		printf("The char '%c' does not exist.\r\n",paraChar);
		return;
	}
	
	//删除元素 
		q=p->next ;
		r=q->next ;
		p->next =r;
		if(r!=NULL)
		{
			r->previous =p;
		}
		
		free(q);//释放掉删除的元素 
}

void insertDeleteTest()
{
	DLNodePtr tempList=initLinkList();
	printList(tempList);
	
	insertElement(tempList,'H',0);
	insertElement(tempList,'e',1);
	insertElement(tempList,'l',2);
	insertElement(tempList,'l',3);
	insertElement(tempList,'o',4);
	insertElement(tempList,'!',5);
	printList(tempList);
	//打印插入元素后的链表 
	
	deleteElement(tempList,'e');
	deleteElement(tempList,'a');
	deleteElement(tempList,'o');
	printList(tempList);
	
	insertElement(tempList,'o',1);
	printList(tempList);
}

void basicAddressTest()
{
	DLNode tempNode1,tempNode2;
	
	tempNode1.data =4;
	tempNode1.next =NULL;
	
	tempNode2.data =6;
	tempNode2.next =NULL;
	
	printf("The first node: %d,%d,%d\r\n",
	&tempNode1,&tempNode1.data ,&tempNode1.next );
	printf("The second node: %d,%d,%d\r\n",
	&tempNode2,&tempNode2.data ,&tempNode2.next );
	
	tempNode1.next =&tempNode2;
}

int main()
{
	insertDeleteTest();
	basicAddressTest();
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值