c语言-双向链表

head.c

#define __HEAD_H__                     
                                       
#include <stdio.h>                     
#include <string.h>                    
#include <stdlib.h>                    
                                       
enum passble{FALSE=-1,SUCCESS};        
                                       
typedef char datatype;                 
                                       
//双向链表节点结构体                   
typedef struct Node                    
{                                      
    //数据域:数据元素                 
    datatype data;                     
    //指针域:上一个节点的地址         
    struct Node *prev;                 
    //指针域:下一个节点的地址         
    struct Node *next;                 
}*Doublelink;                          
                                       
                                       
Doublelink insert_head();              
                                       
Doublelink create_node();              
                                       
void output();                         
                                       
Doublelink head_delete();              
                                       
Doublelink tail_insert();              
                                       
Doublelink tail_delete();              
                                       
#endif                                 
                                       

main.c

#include "head.h"                                          |
int main(int argc, const char *argv[])                     |
{                                                          |
    Doublelink head=NULL; //定义双向链表头节点             |
    int n;                                                 |
    printf("please enter n:");                             |
    scanf("%d",&n);                                        |
    datatype element;                                      |
    for(int i=0;i<n;i++)                                   |
    {                                                      |
        printf("please enter %d element:",i+1);            |
        //scanf("%c",&element);                            |
        getchar();                                         |
        element=getchar();                                 |
        head=insert_head(element,head);                    |
    }                                                      |
                                                           |
    output(head);                                          |
                                                           |
    head=head_delete(head);                                |
    output(head);                                          |
                                                           |
    printf("input the element you want to insert into tail"|
    element = getchar();                                   |
    head = tail_insert(element, head);                     |
    output(head);                                          |
                                                           |
                                                           |
    head = tail_delete(head);                              |
    output(head);                                          |
    return 0;                                              |
}                                                          |
                                                           |

test.c

#include "head.h"                                                             
//创建新节点                                                                  
Doublelink create_node()                                                      
{                                                                             
    Doublelink s=(Doublelink)malloc(sizeof(struct Node));                     
    if(NULL==s)                                                               
        return NULL;                                                          
    //新节点的数据与初始化                                                    
    s->data=0;                                                                
    //新节点的两个指针域                                                      
    s->next=s->prev=NULL;                                                     
    return s;                                                                 
}                                                                             
                                                                              
Doublelink insert_head(datatype element,Doublelink head)                      
{                                                                             
    //创建一个新节点                                                          
    Doublelink s=create_node();                                               
    s->data=element;                                                          
    //1.链表为空                                                              
    if(NULL==head){                                                           
        head=s;                                                               
    }                                                                         
    else                                                                      
    {                                                                         
        //2.链表存在多个节点>=1                                               
        s->next=head;                                                         
        head->prev=s;                                                         
        head=s;                                                               
    }                                                                         
    return head;                                                              
                                                                              
}                                                                             
                                                                              
void output(Doublelink head)                                                  
{                                                                             
    //1.判断链表是否为空                                                      
    if(NULL==head)                                                            
        return;                                                               
    //2.正向遍历                                                              
    Doublelink p=head;                                                        
    while(p->next!=NULL)//最后一个节点的数据域不打印                          
    {                                                                         
        printf("%c ",p->data);                                                
        p=p->next;                                                            
    }                                                                         
                                                                              
    printf("%c\n",p->data);                                                   
    //逆向遍历                                                                
    while(p!=NULL)                                                            
    {                                                                         
                                                                              
        printf("%c ",p->data);                                                
        p=p->prev;                                                            
    }                                                                         
    putchar(10);                                                              
                                                                              
}                                                                             
                                                                              
                                                                              
Doublelink head_delete(Doublelink head)                                       
{                                                                             
    //1.判断链表是否为空                                                      
    if(NULL==head)                                                            
    {                                                                         
        return head;                                                          
    }                                                                         
    //2.链表存在多个节点 >=1                                                  
    Doublelink del=head;                                                      
    head=head->next;                                                          
    free(del);                                                                
    del=NULL;                                                                 
    return head;                                                              
}                                                                             
                                                                              
Doublelink tail_insert(datatype element, Doublelink head){                    
    Doublelink p = head;                                                      
    Doublelink s = create_node();                                             
    s->data = element;                                                        
                                                                              
    if(head == NULL)                                                          
        head = s;                                                             
                                                                              
    while(p->next){                                                           
        p = p->next;                                                          
    }                                                                         
                                                                              
    p->next = s;                                                              
    s->prev = p;                                                              
                                                                              
    return head;                                                              
}                                                                             
                                                                              
                                                                              
Doublelink tail_delete(Doublelink head){                                      
    Doublelink p = head;                                                      
                                                                              
    while(p->next->next){                                                     
        p = p->next;                                                          
    }                                                                         
                                                                              
    Doublelink s = p->next;                                                   
    p->next = NULL;                                                           
    p->next->prev = NULL;                                                     
    free(s);                                                                  
                                                                              
    return head;                                                              
}                                                                             
                                                                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值