目錄
- 一、雙向迴圈連結串列存在的意義
- 二、節點的定義
- 三:實現
- 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;
}
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;
}
尾插入
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;
}
中間插入
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;
}