数据结构c语言3:双向链表

1. 结构体的创建
typedef struct DlinkedNode{
	char data;
	struct DlinkedNode *previous;
	struct DlinkedNode *next;
}DLNode,*DLNodePtr;
2.初始化
DLNodePtr initlinkList(){
	DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
	tempHeader->data='\0';
	tempHeader->previous=NULL;
	tempHeader->next=NULL;
	return tempHeader;
}

在这里插入图片描述

3. 打印链表
void printList(DLNodePtr paraHeader){
	DLNodePtr p=paraHeader->next;
	while(p!=NULL){
		printf("%c",p->data);
		p=p->next;
	}
	printf("\r\n");
} 
4.头插法
void insertByHead(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p,q;
	p=paraHeader;
	 
	//Step1.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step2.插入
	if(p->next!=NULL){
		p->next->previous=q;
	}
	q->next=p->next;
	q->previous=p;
	p->next=q;
}

在这里插入图片描述

5. 尾插法
void insertByTail(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p,q;
	p=paraHeader;   
	
	//Step1.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step2.插入
	while(p->next){
		p=p->next;
	}
	p->next=q;
	q->previous=p;
	q->next=NULL;	
} 

在这里插入图片描述

6.指定位置插入
void insertByPos(DLNodePtr paraHeader,char paraChar,int paraPosition){
	DLNodePtr p,q;
	
	//Step1.找到位置
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p=p->next;
		if(p==NULL){
			printf("不存在此位置");
			return; 
		}
	}
	
	//Step2.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step3.插入
	if(p->next!=NULL){
		p->next->previous=q;
	}
	q->next=p->next;
	p->next=q;
	q->previous=p; 
}

7.按位置删除
void deleteBypos(DLNodePtr paraHeader,int paraPosition){
	DLNodePtr p=paraHeader;
	
	//Step1.定位 
	if(paraPosition<1){
		printf("位置不合要求\r\n");
		return; 
	}
	for(int i=1;i<=paraPosition;i++){
		p=p->next;
	}
	
	//Step2.删除结点
	p->previous->next=p->next;
	if(p->next!=NULL){
		p->next->previous=p->previous;
	} 
	free(p); 
}

8.按值删除
void deleteByData(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p=paraHeader,q;
	
	//Step1.定位
	while((p->next!=NULL)&&(p->next->data!=paraChar)){
		p=p->next;
	} 
	
	//Step2.Error check
	if(p->next==NULL){
		printf("此值不存在\r\n");
		return;
	}
	
	//Step3.删除
	q=p->next;
	p->next=q->next;
	if(q->next!=NULL){
		q->next->previous=p;
	} 
	free(q);
}

在这里插入图片描述

9.摧毁链表
void DestroyLink(DLNodePtr paraHeader){
	DLNodePtr p=paraHeader,q;
	
	while(p){
		p=p->next;
		q=p;
		free(q);
	}
	p->next=NU
完整代码
#include<stdio.h>
#include<malloc.h>

//结构体的创建
typedef struct DlinkedNode{
	char data;
	struct DlinkedNode *previous;
	struct DlinkedNode *next;
}DLNode,*DLNodePtr; 

//初始化
DLNodePtr initlinkList(){
	DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
	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 insertByHead(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p,q;
	p=paraHeader;
	 
	//Step1.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step2.插入
	if(p->next!=NULL){
		p->next->previous=q;
	}
	q->next=p->next;
	q->previous=p;
	p->next=q;
}

//尾插法
void insertByTail(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p,q;
	p=paraHeader;   
	
	//Step1.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step2.插入
	while(p->next){
		p=p->next;
	}
	p->next=q;
	q->previous=p;
	q->next=NULL;	
} 

//指定位置插入
void insertByPos(DLNodePtr paraHeader,char paraChar,int paraPosition){
	DLNodePtr p,q;
	
	//Step1.找到位置
	p=paraHeader;
	for(int i=0;i<paraPosition;i++){
		p=p->next;
		if(p==NULL){
			printf("不存在此位置");
			return; 
		}
	}
	
	//Step2.创建新结点
	q=(DLNodePtr)malloc(sizeof(DLNode));
	q->data=paraChar;
	
	//Step3.插入
	if(p->next!=NULL){
		p->next->previous=q;
	}
	q->next=p->next;
	p->next=q;
	q->previous=p; 
}

//统计元素个数
int Number(DLNodePtr paraHeader,int paraData){
	DLNodePtr p;
	int num=0;
	p=paraHeader;
	while(p){
		if(p->data==paraData){
			num++;
			p=p->next;
		}
	}
	return num; 
}

//按位置删除
void deleteBypos(DLNodePtr paraHeader,int paraPosition){
	DLNodePtr p=paraHeader;
	
	//Step1.定位 
	if(paraPosition<1){
		printf("位置不合要求\r\n");
		return; 
	}
	for(int i=1;i<=paraPosition;i++){
		p=p->next;
	}
	
	//Step2.删除结点
	p->previous->next=p->next;
	if(p->next!=NULL){
		p->next->previous=p->previous;
	} 
	free(p); 
}

//按值删除
void deleteByData(DLNodePtr paraHeader,char paraChar){
	DLNodePtr p=paraHeader,q;
	
	//Step1.定位
	while((p->next!=NULL)&&(p->next->data!=paraChar)){
		p=p->next;
	} 
	
	//Step2.Error check
	if(p->next==NULL){
		printf("此值不存在\r\n");
		return;
	}
	
	//Step3.删除
	q=p->next;
	p->next=q->next;
	if(q->next!=NULL){
		q->next->previous=p;
	} 
	free(q);
}

//摧毁链表
void DestroyLink(DLNodePtr paraHeader){
	DLNodePtr p=paraHeader,q;
	
	while(p){
		p=p->next;
		q=p;
		free(q);
	}
	p->next=NULL;
} 

//测试
void test(){
	//Step1.建一个空表
	DLNodePtr tempList=initlinkList();
	printList(tempList);
	
	//Step2.头插法插入一些元素
	insertByHead(tempList,'H');
	insertByHead(tempList,'e');
	insertByHead(tempList,'l');
	insertByHead(tempList,'l');
	insertByHead(tempList,'o');
	insertByHead(tempList,'!');
	printList(tempList);
	
	//Step2.尾插法插入一些元素
	insertByTail(tempList,'W');
	insertByTail(tempList,'o');
	insertByTail(tempList,'r');
	insertByTail(tempList,'l');
	insertByTail(tempList,'d');
	insertByTail(tempList,'!');
	printList(tempList);
	
	//Step3.指定位置插入
	insertByPos(tempList, 'S', 0);
	insertByPos(tempList, 'W', 1);
	insertByPos(tempList, 'P', 2);
	insertByPos(tempList, 'U', 3);
	printList(tempList);
	
	//Step5.按位置删除 
	deleteBypos(tempList,2);
	deleteBypos(tempList,3);
	printList(tempList);
	
	//Step6.按值删除
	deleteByData(tempList,'e');
	deleteByData(tempList,'!');
	printList(tempList);
	
	//销毁
	DestroyLink(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(){
	test();
	basicAddressTest();
}

运行结果
!olleH
!olleHWorld!
SWPU!olleHWorld!
SP!olleHWorld!
SPollHWorld!

这里有一个问题还未解决,按位置删除时,我给的位置是2和3,运行结果删掉的确是W和U

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值