還需改進: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...