数据结构3-双向链表

目录

一、老师部分

二、 自己部分

一、老师部分

1.完整代码

#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;
	int i;
	for(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 = p->next;
	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 = q;
	} 
	
	//第四步:释放内存
	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;
	} 

void main(){
	insertDeleteTest();
	basicAddressTest();
}

2.运行结果

二、 自己部分

1.双向链表定义

双向链表顾名思义,就是由单向的链变成双向链,在单链表中,我们有一个数据域,还有一个指针域,数据域用来存储相关数据,而指针域则负责链表之间的“联系”。 而在双向链表中,我们需要有两个指针域,一个负责向后连接,一个负责向前连接。

2.函数实现

   DLNodePtr locateElement(DLNodePtr paraHeader,char paraChar) {
   	    DLNodePtr p = paraHeader;
   	    while((p->next!=NULL) && (p->next->data!=paraChar)){
   	    	p = p->next;
		   }
		if(p->next == NULL){
			printf("The char '%d' does not exist",paraChar);
			return NULL;
		}
		return p;
   }

3.函数测试

void locateElementTest(){
	DLNodePtr tempList = initLinkList();
	
	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);
	
	DLNodePtr newList = locateElement(tempList, 'e');
	if (newList != NULL) {
		printList(newList);
	}
	newList = locateElement(tempList, 'a');
	if (newList != NULL) {
		printList(newList);
	}
	newList = locateElement(tempList, 'o');
	if (newList != NULL) {
		printList(newList);
	}
}

4.完整代码 

#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;
	int i;
	for(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 = p->next;
	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 = q;
	} 
	
	//第四步:释放内存
	free(q); 
}//删除元素 

   DLNodePtr locateElement(DLNodePtr paraHeader,char paraChar) {
   	    DLNodePtr p = paraHeader;
   	    while((p->next!=NULL) && (p->next->data!=paraChar)){
   	    	p = p->next;
		   }
		if(p->next == NULL){
			printf("The char '%c' does not exist",paraChar);
			return NULL;
		}
		return p;
   }

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 locateElementTest(){
	DLNodePtr tempList = initLinkList();
	
	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);
	
	DLNodePtr newList = locateElement(tempList, 'e');
	if (newList != NULL) {
		printList(newList);
	}
	newList = locateElement(tempList, 'a');
	if (newList != NULL) {
		printList(newList);
	}
	newList = locateElement(tempList, 'o');
	if (newList != NULL) {
		printList(newList);
	}
}

	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();
	locateElementTest();
	
	return 0;
}

5.运行结果

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值