此次代码为对带头结点双向链表部分操作的函数实现:
程序代码:
//对带头结点双向链表进行按元素删除
void DLinklistErase(DLinkNode** head,DLinkType value){
DLinkNode * cur = (*head)->next;
while(cur->data!=value&&cur!=(*head)){
cur = cur->next;
}
if(cur == (*head)){
return;
}else{
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
}
}
//对带头结点的双向链表进行按位置删除
void DLinkListRemove(DLinkNode** head,DLinkNode * pos){
DLinkNode* cur = (*head)->next;
while(cur != pos&&cur!=(*head)){
cur = cur->next;
}
if(cur == (*head)){
return;
}else{
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
}
}
//将带头结点的双向链表的元素全部删除
void DLinkListRemoveAll(DLinkNode** head){
DLinkNode* cur = (*head);
while(cur->next != (*head)){
DLinkListPopFront(head);
}
}
//求带头结点的双向链表的结点个数
size_t DLinkListSize(DLinkNode* head){
size_t count=0;
if(head->next == head){
return count;
}
DLinkNode* cur = head->next;
while(cur!= head){
count++;
cur = cur->next;
}
return count;
}
//将带头结点的双向链表置空
void DLinkListEmpty(DLinkNode** head){
if(head == NULL){
return;
}
if((*head)->next == (*head)){
return;
}
DLinkNode* cur = (*head);
while(cur->next != (*head)){
DLinkListPopFront(head);
}
}
检测代码:
void textDLinkListEmpty(){
DLinkNode* head = (DLinkNode*)malloc(sizeof(DLinkNode));
DLinkListInit(&head);
DLinkListPushBack(&head, 'a');
DLinkListPushBack(&head, 'b');
DLinkListPushBack(&head, 'c');
DLinkListPushBack(&head, 'd');
DLinkListEmpty(&head);
PrintLinkList(head,"DLinkListEmpty");
}
void textDLinkListSize(){
DLinkNode* head = (DLinkNode*)malloc(sizeof(DLinkNode));
DLinkListInit(&head);
DLinkListPushBack(&head, 'a');
DLinkListPushBack(&head, 'b');
DLinkListPushBack(&head, 'c');
DLinkListPushBack(&head, 'd');
size_t ret = DLinkListSize(head);
printf("\n****DLinkListSize***********\n");
printf("%d\n",ret);
}
void textDLinkListRemoveAll(){
DLinkNode* head = (DLinkNode*)malloc(sizeof(DLinkNode));
DLinkListInit(&head);
DLinkListPushBack(&head, 'a');
DLinkListPushBack(&head, 'b');
DLinkListPushBack(&head, 'c');
DLinkListPushBack(&head, 'd');
DLinkListRemoveAll(&head);
PrintLinkList(head,"DLinkListRemoveAll");
}
void textDLinkListRemove(){
DLinkNode* head = (DLinkNode*)malloc(sizeof(DLinkNode));
DLinkListInit(&head);
DLinkListPushBack(&head, 'a');
DLinkListPushBack(&head, 'b');
DLinkListPushBack(&head, 'c');
DLinkListPushBack(&head, 'd');
DLinkListRemove(&head,head->next);
PrintLinkList(head,"DLinkListRemove");
}
void textDLinklistErase(){
DLinkNode* head = (DLinkNode*)malloc(sizeof(DLinkNode));
DLinkListInit(&head);
DLinkListPushBack(&head, 'a');
DLinkListPushBack(&head, 'b');
DLinkListPushBack(&head, 'c');
DLinkListPushBack(&head, 'd');
DLinklistErase(&head,'a');
PrintLinkList(head,"DLinkListErase");
}
//主函数
int main(){
textDLinkListPushBack();
textDLinkListPopBack();
textDLinkListPushFront();
textDLinkListPopFront();
textDLinkListFind();
textDLinkListInsert();
textDLinkListInsertAfter();
textDLinklistErase();
textDLinkListRemove();
textDLinkListRemoveAll();
textDLinkListSize();
textDLinkListEmpty();
}
检测结果:
[chaiyandong@localhost shujujiegou]$ ./dlinklist1
*********DLinkListPushBack*************
a b c d
*********DLinkListPopBack*************
a b c
*********DLinkListPushFront*************
d c b a
*********DLinkListPopFront*************
b c d
*******DLinkListFind***********
expect:1 actual:1
*********DLinkListInsert*************
z a b c d
*********DLinkListInsert*************
a z b c d
*********DLinkListErase*************
b c d
*********DLinkListRemove*************
b c d
*********DLinkListRemoveAll*************
****DLinkListSize***********
4
*********DLinkListEmpty*************