栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构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='';
	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("rn");
} 
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
		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("位置不合要求rn");
		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("此值不存在rn");
		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
#include

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

//初始化
DLNodePtr initlinkList(){
	DLNodePtr tempHeader=(DLNodePtr)malloc(sizeof(DLNode));
	tempHeader->data='';
	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("rn");
} 

//头插法
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
		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("位置不合要求rn");
		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("此值不存在rn");
		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, %drn",&tempNode1, &tempNode1.data, &tempNode1.next);
	printf("The second node: %d, %d, %drn",&tempNode2, &tempNode2.data, &tempNode2.next);

	tempNode1.next = &tempNode2;
} 
int main(){
	test();
	basicAddressTest();
}

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853293.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号