数据结构05

一:思维导图

二:

1】 按值修改

2】按值查找,返回当前节点的地址 (先不考虑重复,如果有重复,返回第一个)

3】 反转

4】销毁链表

//功能函数

                                                                                                                 
//按值修改                                                                                                       
int index_rep(linklist_ptr H,Datatype a,Datatype b)                                                              
{                                                                                                                
    if(H == NULL||empty(H))                                                                                      
    {                                                                                                            
        printf("修改不合法\n");                                                                                  
        return 0;                                                                                                
    }                                                                                                            
    //定义一个指针指向要修改的节点                                                                               
    linklist_ptr q = H;                                                                                          
    for(int i=0;i<H->len;i++)                                                                                    
    {                                                                                                            
        q=q->next;                                                                                               
        if(q->data == a)                                                                                         
        {                                                                                                        
            q->data =b;                                                                                          
        }                                                                                                        
    }                                                                                                            
    return 1;                                                                                                    
}                                                                                                                
                                                                                                                 
                                                                                                                 
//按值查找 返回当前节点的地址                                                                                    
linklist_ptr index_val(linklist_ptr H,Datatype a)                                                                
{                                                                                                                
    if(H==NULL ||empty(H))                                                                                       
    {                                                                                                            
        printf("查找不合法\n");                                                                                  
        return 0;                                                                                                
    }                                                                                                            
    //定义一个指针指向要查找的节点                                                                               
    linklist_ptr q = H;                                                                                          
    for(int i=0;i<H->len;i++)                                                                                    
    {                                                                                                            
        q=q->next;                                                                                               
        if(q->data == a)                                                                                         
        {                                                                                                        
            return q;                                                                                            
        }                                                                                                        
                                                                                                                 
    }                                                                                                            
}                                                                                                                
//反转                                                                                                           
int turn (linklist_ptr H)                                                                                        
{                                                                                                                
    if(H==NULL)                                                                                                  
    {                                                                                                            
        printf("无法反转\n");                                                                                    
        return -1;                                                                                               
    }                                                                                                            
    if(H->next ==NULL || H->next->next ==NULL)                                                                   
    {                                                                                                            
        printf("链表长度达不到反转要求\n");                                                                      
        return 0;                                                                                                
    }                                                                                                            
                                                                                                                 
    //定义两个指针                                                                                               
    linklist_ptr p,q;                                                                                            
                                                                                                                 
    p =H->next->next;                                                                                            
    H->next->next =NULL;                                                                                         
                                                                                                                 
    while(p!=NULL)                                                                                               
    {                                                                                                            
        q=p;                                                                                                     
        p=p->next;                                                                                               
        q->next = H->next;                                                                                       
        H->next =q;                                                                                              
    }                                                                                                            
    return 0;                                                                                                    
}                                                                                                                
//销毁链表                                                                                                       
void my_free(linklist_ptr *H){                                                                                   
    if(H==NULL)                                                                                                  
    {                                                                                                            
        printf("无法销毁\n");                                                                                    
        return;                                                                                                  
    }                                                                                                            
    free(*H);                                                                                                    
    *H = NULL;                                                                                                   
    return;                                                                                                      
}                                                                                                                
#include "linklist.h"                                                    
                                                                         
linklist_ptr create_ptr()                                                
{                                                                        
    linklist_ptr H = (linklist_ptr)malloc(sizeof(linklist));             
                                                                         
    if(H==NULL)                                                          
    {                                                                    
        printf("创建失败\n");                                            
        return NULL;                                                     
    }                                                                    
                                                                         
    H->len=0;                                                            
    H->next=NULL;                                                        
    printf("单链表创建成功\n");                                          
    return H;                                                            
}                                                                        
                                                                         
//单链表的判空                                                           
int empty (linklist_ptr H){                                              
    if(H == NULL){                                                       
        printf("判空失败\n");                                            
        return -1;                                                       
    }                                                                    
                                                                         
    return H->len==0;                                                    
}                                                                        
                                                                         
//申请节点 封装数据                                                      
linklist_ptr create_node(Datatype a)                                     
{                                                                        
    linklist_ptr P = (linklist_ptr)malloc(sizeof(linklist));             
                                                                         
    if(P==NULL)                                                          
    {                                                                    
        printf("申请失败\n");                                            
        return NULL;                                                     
    }                                                                    
    P->data=a;                                                           
    P->next=NULL;                                                        
    return P;                                                            
                                                                         
}                                                                        
                                                                         
//头插                                                                   
int head_add(linklist_ptr H,Datatype a)                                  
{                                                                        
    //检查所接收链表的合法性                                             
    if(H == NULL)                                                        
    {                                                                    
        printf("插入失败\n");                                            
        return 0;                                                        
    }                                                                    
                                                                         
    //申请节点 封装数据                                                  
    linklist_ptr P =create_node(a);                                      
                                                                         
    //头插                                                               
    P->next = H->next;                                                   
    H->next = P;                                                         
                                                                         
    H->len++;                                                            
    return 1;                                                            
}                                                                        
                                                                         
//遍历                                                                   
void show(linklist_ptr H)                                                
{                                                                        
    //判空                                                               
    if(H==NULL||empty(H))                                                
    {                                                                    
        printf("遍历失败\n");                                            
    }                                                                    
                                                                         
    //定义一个遍历的指针                                                 
    linklist_ptr q = H;                                                  
    for(int i=0;i<H->len;i++)                                            
    {                                                                    
        q=q->next;                                                       
        printf("%d ",q->data);                                           
    }                                                                    
    printf("\n");                                                        
}                                                                        


//main 函数
#include "linklist.h"                                                   
                                                                        
int main(int argc, const char *argv[])                                  
{                                                                       
    linklist_ptr H=create_ptr();                                        
                                                                        
    //单链表的判空                                                      
    empty(H);                                                           
                                                                        
    //头插                                                              
    head_add(H,10);                                                     
    head_add(H,25);                                                     
    head_add(H,30);                                                     
    head_add(H,40);                                                     
    head_add(H,50);                                                     
    head_add(H,60);                                                     
                                                                                                                       
    //任意位置修改数据                                                  
    index_change(H,2,18);                                               
                                                                        
    //按值修改                                                          
    index_rep(H,18,19);                                                 
                                                                        
    //按值查找 返回当前节点的地址                                       
    linklist_ptr q = index_val(H,19);                                   
    printf("要查找的值地址为:%p\n",q);                                  
    //反转                                                              
    printf("反转前的单链表\n");                                         
    show(H);                                                            
    turn(H);                                                            
    printf("反转后的单链表\n");                                         
    show(H);                                                            
                                                                        
                                                                        
    //销毁链表                                                          
    my_free(&H);                                                        
                                                                        
    return 0;                                                           
}                                                                       
                                                                        

//测试文件
#ifndef __LINKLIST_H__
#define __LINKLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef int Datatype;
typedef struct node
{
    union{
        Datatype data;
        int len;
    };

    struct node* next;
}linklist,*linklist_ptr;

//创建单链表
linklist_ptr create_ptr();

//单链表的判空
int empty(linklist_ptr H);

//申请节点 封装数据
linklist_ptr create_node(Datatype a);

//头插
int head_add(linklist_ptr H,Datatype a);

//遍历
void show (linklist_ptr H);

//按值修改
int index_rep(linklist_ptr H,Datatype a,Datatype b);

//按值查找 返回当前节点的地址
linklist_ptr index_val(linklist_ptr H,Datatype a);

//反转
int turn(H);

                                                                               
//销毁链表
void my_free(linklist_ptr *H);


#endif
                                                                               
                                                                               
                                                                  
                                                                                                           

运行结果示意图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值