鍊錶 帶頭結點的雙向迴圈鍊錶

2021-09-11 01:14:20 字數 3757 閱讀 2423

還需改進:

creat_node這個函式應有返回型別,來判斷新建結點是否成功,不然主函式中不管成不成功都會訪問該節點成員。

改了這個函式,在主函式中create_node後要判斷是否成功,不成功就提示並退出函式,退出前別忘了還要釋放鍊錶!

同時create_link這個函式中也要判斷head是否申請成功,不成功的話同樣提示並退出函式。

#include #include struct dnode

;typedef struct dnode dnode;

typedef struct dnode * dlink;

void create_dnode(dlink *dblnode)

while(!is_malloc_ok(*dblnode) && count);

}int is_malloc_ok(dlink dblnode)

return 1;

}void create_dlink(dlink *dblhead)

void insert_dnode_head(dlink dblhead,dlink dblnode)

void display(dlink dblhead)

dlink p = dblhead;

printf("該鍊錶顯示是:\n");

if(p->next == dblhead)

else

}}int length(dlink dblhead)

return count;

}void insert_dnode_tail(dlink dblhead,dlink dblnode)

void insert_dnode_mid_before(dlink dblhead,dlink dblnode,int num)

if(p == dblhead)

else

}void insert_dnode_mid_after(dlink dblhead,dlink dblnode,int num)

if(p == dblhead)

else

}void delete_dnode(dlink dblhead,int num)

if(p == dblhead)

else

}dlink find(dlink dblhead,int num)

if(p == dblhead)

else

}void make_empty(dlink dblhead)

}void release_dlink(dlink *dblhead)

int main()

display(dblhead);

printf("該鍊錶長度為%d\n\n",length(dblhead));

create_dnode(&dblnode);

printf("請輸入你想插入的結點的數值:");

scanf("%d",&dblnode->num);

printf("請輸入你想在值為哪個的結點前插入該結點:");

scanf("%d",&num);

insert_dnode_mid_before(dblhead,dblnode,num);

display(dblhead);

printf("該鍊錶長度為%d\n\n",length(dblhead));

create_dnode(&dblnode);

printf("請輸入你想插入的結點的數值:");

scanf("%d",&dblnode->num);

printf("請輸入你想在值為哪個的結點後插入該結點:");

scanf("%d",&num);

insert_dnode_mid_after(dblhead,dblnode,num);

display(dblhead);

printf("該鍊錶長度為%d\n\n",length(dblhead));

printf("請輸入你想刪除的結點的數值:");

scanf("%d",&num);

delete_dnode(dblhead,num);

display(dblhead);

printf("該鍊錶長度為%d\n\n",length(dblhead));

printf("請輸入你想查詢的結點的數值:");

scanf("%d",&num);

dblnode = find(dblhead,num);

if(dblnode == null)

else

make_empty(dblhead);

display(dblhead);

printf("該鍊錶長度為%d\n\n",length(dblhead));

release_dlink(&dblhead);

display(dblhead);

return 0;

}

要注意的點:

前指標和後指標名字

makeempty函式我清空的時候並沒有每刪乙個都保持環,所以最後一步要讓head的prior指向head,不然再加node就會有錯

display函式要判斷一下頭結點是否為空!空就是已經被釋放了!這個也要注意別忘了

delete函式裡也要注意刪除指標的時候,前後兩個節點有兩根線要連,不要只連乙個了

#include #include struct node

;typedef struct node node;

typedef struct node *link;

int createnode(link *new_node)

int createlink(link *head)

void inserthead(link head, link node)

void inserttail(link head, link node)

void insertbefore(link head, link node, int num)

p = p->next;

} printf("cannot find the node!\n");

}void insertafter(link head, link node, int num)

p = p->next;

} printf("cannot find the node!\n");

}void delete(link head, int num)

p = p->next;

} printf("cannot find the node!\n");

}void display(link head)

while(p != head) }

void makeempty(link head)

head->prior = head;

}void releaselink(link *head)

int main()

} display(head);

printf("\n");

if(createnode(&new_node))

delete(head, 6);

display(head);

printf("\n");

makeempty(head);

for(i = 0; i < 7; i++) }

display(head);

printf("\n");

releaselink(&head);

return 0;

}

C 實現雙向迴圈鍊錶(帶頭結點)

雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈鍊錶。簡單的畫乙個雙向迴圈簡易圖 下面就用c 實現一下基本操作 當然也有 c 語言 版的,只是單鏈表操作...

建立鍊錶(帶頭 雙向 迴圈)

第一次嘗試 這是 h 部分的 pragma once 使用這種方式來重新命名資料型別,這樣可以很方便的修改後續資料的資料型別,相當於 define的作用 typedef int listtype 建立資料結點 typedef struct listnode listnode 建立頭結點 typede...

不帶頭結點的雙向迴圈鍊錶

基本概念 迴圈鍊錶 將單鏈表中最後乙個結點的next指向頭結點或者空指標,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。雙向鍊錶 是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域prior,在雙向鍊錶的結點中有兩個指標域,乙個next指向直接後繼,乙個prio...