双向链表的操作(C语言)

main函数部分:

#include <stdio.h>
#include "./23_doubleLinkList.h"
int main(int argc, const char *argv[])
{   
    doubleLinkList* head = create_doubleLinkList();
    insertHead_doubleLinkList(head,12);
    insertHead_doubleLinkList(head,21);
    insertHead_doubleLinkList(head,14);
    insertHead_doubleLinkList(head,16);
    
    insertTail_doubleLinkList(head,13);
    show_doubleLinkList(head);
    insertBypos_doubleLinkList(head,33,6);
    show_doubleLinkList(head);
    deleteHead_doubleLinkList(head);
    show_doubleLinkList(head);
    deleteTail_doubleLinkList(head);
    show_doubleLinkList(head);
    deleteBypos_doubleLinkList(head,2);
    show_doubleLinkList(head);                                 
    return 0;
}
                                                               
                                                               

功能函数:

#include<stdio.h>                                                                                                                                                                                                                            
#include <stdlib.h>                                                                                                                                                                                                                          
#include "./23_doubleLinkList.h"                                                                                                                                                                                                             
doubleLinkList* create_doubleLinkList()                                                                                                                                                                                                      
{                                                                                                                                                                                                                                            
    doubleLinkList* head = (doubleLinkList*)malloc(sizeof(doubleLinkList));                                                                                                                                                                  
    if(NULL==head)                                                                                                                                                                                                                           
    {                                                                                                                                                                                                                                        
        printf("头结点创建失败!\n");                                                                                                                                                                                                        
        return NULL;                                                                                                                                                                                                                         
    }                                                                                                                                                                                                                                        
    head->text.len=0;                                                                                                                                                                                                                        
    head->next=head->prev=NULL;                                                                                                                                                                                                              
    return head;                                                                                                                                                                                                                             
}                                                                                                                                                                                                                                            
//判断链表是否为空                                                                                                                                                                                                                           
int isEmpty(doubleLinkList* head)                                                                                                                                                                                                            
{                                                                                                                                                                                                                                            
    return head->next==NULL?1:0;                                                                                                                                                                                                             
}                                                                                                                                                                                                                                            
//头插                                                                                                                                                                                                                                       
void insertHead_doubleLinkList(doubleLinkList* head,datatype num)                                                                                                                                                                            
{                                                                                                                                                                                                                                            
    doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));                                                                                                                                                                    
    if(NULL == temp)                                                                                                                                                                                                                         
    {                                                                                                                                                                                                                                        
        printf("头结点创建失败!\n");                                                                                                                                                                                                        
        return;                                                                                                                                                                                                                              
                                                                                                                                                                                                                                             
    }                                                                                                                                                                                                                                        
    temp->text.data=num;                                                                                                                                                                                                                     
    temp->next=temp->prev=NULL;                                                                                                                                                                                                              
    //插入操作                                                                                                                                                                                                                               
    //需分情况考虑该链表是否有元素,以免出现段错误                                                                                                                                                                                           
        if(head->next!=NULL)                                                                                                                                                                                                                 
    {                                                                                                                                                                                                                                        
        temp->next = head->next;                                                                                                                                                                                                             
        head->next=temp;                                                                                                                                                                                                                     
        temp->prev=head;                                                                                                                                                                                                                     
        temp->next->prev=temp;                                                                                                                                                                                                               
    }else                                                                                                                                                                                                                                    
    {                                                                                                                                                                                                                                        
        temp->next = head->next;                                                                                                                                                                                                             
        head->next=temp;                                                                                                                                                                                                                     
        temp->prev=head;                                                                                                                                                                                                                     
    }                                                                                                                                                                                                                                        
    head->text.len++;                                                                                                                                                                                                                        
    return;                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                             
}                                                                                                                                                                                                                                            
//尾插                                                                                                                                                                                                                                       
void insertTail_doubleLinkList(doubleLinkList* head,datatype num)                                                                                                                                                                            
{                                                                                                                                                                                                                                            
    //定义一个新的结点                                                                                                                                                                                                                       
    doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));                                                                                                                                                                    
    if(NULL == temp)                                                                                                                                                                                                                         
    {                                                                                                                                                                                                                                        
        printf("头结点创建失败!\n");                                                                                                                                                                                                        
        return;                                                                                                                                                                                                                              
                                                                                                                                                                                                                                             
    }                                                                                                                                                                                                                                        
    temp->text.data=num;                                                                                                                                                                                                                     
    temp->next=temp->prev=NULL;                                                                                                                                                                                                              
    //找到尾部的结点,p就是原双向链表的尾部结点                                                                                                                                                                                              
    doubleLinkList* p=head;                                                                                                                                                                                                                  
    while(p->next!=NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        p=p->next;                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                        
    p->next=temp;                                                                                                                                                                                                                            
    temp->next=NULL;                                                                                                                                                                                                                         
    temp->prev=p;                                                                                                                                                                                                                            
    head->text.len++;                                                                                                                                                                                                                        
    return;                                                                                                                                                                                                                                  
}                                                                                                                                                                                                                                            
//按位置插入                                                                                                                                                                                                                                 
void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos)                                                                                                                                                                   
{                                                                                                                                                                                                                                            
    if(pos<1 || pos>head->text.len+1)                                                                                                                                                                                                        
    {                                                                                                                                                                                                                                        
        printf("输入的位置%d不合法!\n",pos);                                                                                                                                                                                                
    }                                                                                                                                                                                                                                        
    //定义一个新的结点                                                                                                                                                                                                                       
    doubleLinkList* temp=(doubleLinkList*)malloc(sizeof(doubleLinkList));                                                                                                                                                                    
    if(NULL == temp)                                                                                                                                                                                                                         
    {                                                                                                                                                                                                                                        
        printf("头结点创建失败!\n");                                                                                                                                                                                                        
        return;                                                                                                                                                                                                                              
                                                                                                                                                                                                                                             
    }                                                                                                                                                                                                                                        
    temp->text.data=num;                                                                                                                                                                                                                     
    temp->next=temp->prev=NULL;                                                                                                                                                                                                              
    //找到要插入位置的前一个`结点                                                                                                                                                                                                            
    doubleLinkList* p=head;                                                                                                                                                                                                                  
    int i;                                                                                                                                                                                                                                   
    for(i=0;i<pos-1;i++)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        p=p->next;                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                        
    temp->next=p->next;                                                                                                                                                                                                                      
    p->next=temp;                                                                                                                                                                                                                            
    temp->prev=p;                                                                                                                                                                                                                            
    if(temp->next!=NULL)                                                                                                                                                                                                                     
    temp->next->prev=temp;                                                                                                                                                                                                                   
    head->text.len++;                                                                                                                                                                                                                        
    return;                                                                                                                                                                                                                                  
}                                                                                                                                                                                                                                            
//头删                                                                                                                                                                                                                                       
void deleteHead_doubleLinkList(doubleLinkList* head)                                                                                                                                                                                         
{                                                                                                                                                                                                                                            
    if(head->next==NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        printf("链表为空!\n");                                                                                                                                                                                                              
        return;                                                                                                                                                                                                                              
    }                                                                                                                                                                                                                                        
    //定义一个指针指向要删除的结点方便后续释放                                                                                                                                                                                               
    doubleLinkList* temp;                                                                                                                                                                                                                    
    temp=head->next;                                                                                                                                                                                                                         
                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                             
    head->next=temp->next;                                                                                                                                                                                                                   
    //需分情况考虑该结点是否为链表最后一个结点,以免出现段错误                                                                                                                                                                               
    if(temp->next!=NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        temp->next->prev=head;                                                                                                                                                                                                               
    }                                                                                                                                                                                                                                        
    free(temp);                                                                                                                                                                                                                              
    head->text.len--;                                                                                                                                                                                                                        
    return;                                                                                                                                                                                                                                  
}                                                                                                                                                                                                                                            
//尾删                                                                                                                                                                                                                                       
void deleteTail_doubleLinkList(doubleLinkList* head)                                                                                                                                                                                         
{                                                                                                                                                                                                                                            
    if(head->next==NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        printf("链表为空!\n");                                                                                                                                                                                                              
        return;                                                                                                                                                                                                                              
    }                                                                                                                                                                                                                                        
    //定义一个指针指向要删除的结点方便后续释放                                                                                                                                                                                               
    doubleLinkList* p=head;                                                                                                                                                                                                                  
    while(p->next!=NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        p=p->next;                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                        
    p->prev->next=NULL;                                                                                                                                                                                                                      
    free(p);                                                                                                                                                                                                                                 
    head->text.len--;                                                                                                                                                                                                                        
    return;                                                                                                                                                                                                                                  
                                                                                                                                                                                                                                             
}                                                                                                                                                                                                                                            
//按位置删除                                                                                                                                                                                                                                 
void deleteBypos_doubleLinkList(doubleLinkList* head,int pos)                                                                                                                                                                                
{                                                                                                                                                                                                                                            
    if(head->next==NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
        printf("链表为空!\n");                                                                                                                                                                                                              
        return;                                                                                                                                                                                                                              
    }                                                                                                                                                                                                                                        
    //判断位置是否合法                                                                                                                                                                                                                       
    if(pos<1 || pos>head->text.len)                                                                                                                                                                                                          
    {                                                                                                                                                                                                                                        
        printf("输入的位置%d不合法!\n",pos);                                                                                                                                                                                                
    }                                                                                                                                                                                                                                        
    //定义一个指针指向要删除的结点方便后续释放                                                                                                                                                                                               
    doubleLinkList* p=head;                                                                                                                                                                                                                  
    int i;                                                                                                                                                                                                                                   
    for(i=0;i<pos;i++)                                                                                                                                                                                                                       
    {                                                                                                                                                                                                                                        
        p=p->next;                                                                                                                                                                                                                           
    }                                                                                                                                                                                                                                        
    //p就是要删除的结点                                                                                                                                                                                                                      
    p->prev->next=p->next;                                                                                                                                                                                                                   
    //当结点不为最后一个节点时,需要将该结点的后一位的前驱指针指向上一个结点                                                                                                                                                                 
    //当结点为最后一个节点则不需要,若不分情况考虑则会出现段错误;                                                                                                                                                                           
    if(p->next!=NULL)                                                                                                                                                                                                                        
    {                                                                                                                                                                                                                                        
    p->next->prev=p->prev;                                                                                                                                                                                                                   
    }                                                                                                                                                                                                                                        
    free(p);                                                                                                                                                                                                                                 
    head->text.len--;                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                            
//遍历                                                                                                                                                                                                                                       
void show_doubleLinkList(doubleLinkList* head)                                                                                                                                                                                               
{                                                                                                                                                                                                                                            
    doubleLinkList* p=head;                                                                                                                                                                                                                  
    if(isEmpty(head))                                                                                                                                                                                                                        
    {                                                                                                                                                                                                                                        
        printf("链表为空!\n");                                                                                                                                                                                                              
    }                                                                                                                                                                                                                                        
    while(p->next!=NULL)                                                                                                                                                                                                                     
    {                                                                                                                                                                                                                                        
            p=p->next;                                                                                                                                                                                                                       
                                                                                                                                                                                                                                             
        printf("%d ",p->text.data);                                                                                                                                                                                                          
    }                                                                                                                                                                                                                                        
    printf("\n");                                                                                                                                                                                                                            
    return;                                                                                                                                                                                                                                  
}                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                             

头文件:

                                                                                 
#ifndef __doubleLinkList_H__
#define __doubleLinkList_H__
typedef int datatype;
union msg{    //若数据的类型也为int,则不需要这个联合体
datatype data;
int len;       //放头结点,记录链表长度
};
typedef struct node{
    union msg text;
    struct node* next; //指针,由于指针指向这一整个节点,所以类型为struct node*
    struct node* prev; 
}doubleLinkList; 

doubleLinkList* create_doubleLinkList();

void insertHead_doubleLinkList(doubleLinkList* head,datatype num);

void insertTail_doubleLinkList(doubleLinkList* head,datatype num);

void deleteBypos_doubleLinkList(doubleLinkList* head,int pos);
void deleteTail_doubleLinkList(doubleLinkList* head);
void deleteHead_doubleLinkList(doubleLinkList* head);
void insertBypos_doubleLinkList(doubleLinkList* head,datatype num,int pos);
void show_doubleLinkList(doubleLinkList* head); 
#endif                                                                                       
                                                                                             

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是双向链表反转的 C 语言代码: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; struct Node* prev; }; void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } void reverseList(struct Node** head) { struct Node* temp = NULL; struct Node* current = *head; while (current != NULL) { temp = current->prev; current->prev = current->next; current->next = temp; current = current->prev; } if (temp != NULL) { *head = temp->prev; } } int main() { struct Node* head = NULL; struct Node* first = (struct Node*)malloc(sizeof(struct Node)); struct Node* second = (struct Node*)malloc(sizeof(struct Node)); struct Node* third = (struct Node*)malloc(sizeof(struct Node)); first->data = 1; first->prev = NULL; first->next = second; second->data = 2; second->prev = first; second->next = third; third->data = 3; third->prev = second; third->next = NULL; head = first; printf("Original List: "); printList(head); reverseList(&head); printf("Reversed List: "); printList(head); return 0; } ``` 在这个代码中,我们定义了一个 `Node` 结构体,包含了数据、前驱指针和后继指针。`printList` 函数用于打印链表中的每个元素。`reverseList` 函数用于反转链表,该函数的参数是一个指向指针的指针,因为我们需要在函数内部改变链表头指针的值。 在 `reverseList` 函数中,我们使用 `temp` 变量来保存当前结点的前驱指针,因为我们需要在交换当前结点的前驱和后继指针后,把它赋给下一个结点的前驱指针。最后,我们需要更新链表头指针的值,否则我们会得到一个不完整的链表。 在 `main` 函数中,我们创建了一个简单的双向链表,并将其传递给 `reverseList` 函数来反转它。最后,我们使用 `printList` 函数来检查链表是否被正确地反转。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值