0
点赞
收藏
分享

微信扫一扫

数据结构:双向链表

艾晓雪 2022-05-03 阅读 93

1.结构储存

typedef struct DoubleLinkedNode{
	char data;
	struct DoubleLinkedNode *previous;
	struct DoubleLinkedNode *next;
}DLNode,*DLNodePtr;

2.初始化及定义


DLNodePtr initLinkList(){
	DLNodePtr tempHeader = (DLNodePtr)malloc(sizeof(struct DoubleLinkedNode));
	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 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 = p->next;
	q->previous = p;
	p->next = q;
	if(r!=NULL){
		r->previous = q;
	}
}

5.删除操作


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' dose not exist.\r\n",paraChar);
		return;
	}
	
	q = p->next;
	r = q->next;
	p->next = r;
	if(r != NULL){
		r->previous = p;
	}
	
	free(q);
}

6.完整代码

#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 = 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' dose 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;
}
 
void main(){
	insertDeleteTest();
	basicAddressTest();
}
举报

相关推荐

0 条评论