雙向迴圈連結串列:(建立、插入、遍歷、求長、查詢、刪除、排序、銷燬)待測

万新鹏發表於2024-04-24

目錄
  • 一、雙向迴圈連結串列存在的意義
  • 二、節點的定義
  • 三:實現
    • 1:建立連結串列(即建立一個空連結串列)
    • 2:建立新結點
    • 3:遍歷
    • 4:插入
      • 頭插入
      • 尾插入
      • 中間插入

一、雙向迴圈連結串列存在的意義

陣列這樣的結構提供了連續記憶體的訪問和使用,連結串列是對記憶體零碎空間的有效組織和使用,雙向迴圈連結串列增大了訪問的自由度。

二、節點的定義

{ //構造雙向連結串列的結點,連結串列中所有結點的資料型別應該是相同的
   int data;
   struct node *pre;
   struct node *next;
}DoubleLList_t;

三:實現

1:建立連結串列(即建立一個空連結串列)

雙向連結串列頭結點是指向自己的:head->next = head;head->pre = head;

DoubleLList_t * createList()
{
	Node * head = (Node *)malloc(sizeof(Node));
	if (NULL == head)
		exit(-1);
	head->pre = head;
	head->next = head;
	return head;
}

image

2:建立新結點

DoubleLList_t * DoubleLList_NewNode(DataType_t data)
	DoubleLList_t* New = (DoubleLList_t*)calloc(1, sizeof(DoubleLList_t));//1.建立一個新結點並對新結點申請記憶體
	if (NULL == New)
	{
		perror("Calloc memory for NewNode is Failed");
		return NULL;
	}

	//2.對新結點的資料域和指標域(2個)進行初始化
	New->data = data;
	New->prev = NULL;
	New->next = NULL;

	return New;
}

3:遍歷

(核心點:對頭結點備份,用迴圈來tem->next指向下一個結點)

void traverseNList(Node* head)
{
	DoubleLList_t* tmp = head->next;//對頭節點的地址備份
	while (tmp != head)
	{
		printf("%-3d", tmp->data);
		tmp = tmp->next;
	}
}

4:插入

頭插入

void insertList(Node* head,int data)
{
     DoubleLList_t* last=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或呼叫上面封裝的函式介面DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	
	while (last->next != head->next  ){ //遍歷找出尾結點
	printf("%-3d", last->data);
	last = last->next;
	}
	last->next=new; //尾結點的地址指向
	new->prev=last;//新結點指向尾結點
	new->new=head->next;
	head->next->prev=new;
	head->next=new;
}

image

尾插入

DoubleLList_t * Tai_deletion(DoubleLList_t * head,int data){
  DoubleLList_t* last=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或呼叫上面封裝的函式介面DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	
	while (last->next != head->next  ){ //遍歷找出尾結點
	printf("%-3d", last->data);
	last = last->next;
	}
	
   new->prev=last;
   last->next=new;
   new->next=head->next;
   head->next->prev=new;
}

image

中間插入

DoubleLList_t * inserposition(){
  DoubleLList_t* p=head->next;
	Node * new=ode *)malloc(sizeof(Node));//或呼叫上面封裝的函式介面DoubleLList_NewNode(data)
	if (NULL == last)
		exit(-1);
	while ((p->next!=p)&&(p->next!=head->next) ){ //遍歷找出尾結點
	printf("%-3d", p->data);
	p = p->next;
	}
   new->next=p->next;
   p->next->prev=new;
   new->prev=p;
   p->next=new;
   }

相關文章