链式存储 结构

/* 
 
    链式存储 结构 
    功能:增加 删除 查找 替换 返回总个数  
    2018年5月11日15点33分  
*/  
  
#include <stdio.h>   
#include <malloc.h>  
#define Ele int  
  
typedef struct _LinkArrary  
{  
    Ele data;  
    struct _LinkArrary * next;  
}LinkArray;  
  
LinkArray* New();  
void Add(LinkArray* L, Ele data);  
int RemoveByData(LinkArray* L, Ele data);  
int RemoveByIndex(LinkArray* L, int index);  
int FindIndexByData(LinkArray* L, Ele data);  
Ele FindDataByIndex(LinkArray* L, int index);  
int ReplaceByIndex(LinkArray* L, int index, Ele value);  
int ReplaceByData(LinkArray* L, Ele oldData, Ele newData, int replaceAll);   
  
void Traserval(LinkArray *L);  
int Count(LinkArray *L);  
  
int main()  
{  
    int i;  
    LinkArray * L = New();//头节点,不存放数据,数据域可存放数据的个数   
    Traserval(L);//遍历  
    //增加   
    for(i = 0; i < 20; i ++)  
    {  
        Add(L,i / 2);  
    }  
    Traserval(L);//遍历   
      
    //RemoveByData(L, 0);//通过给定值删除   
    //RemoveByIndex(L, 0);//通过给定下标删除   
    //printf("查找:%d",FindIndexByData(L, 0));//通过给定值查找   
    //printf("查找:%d\n",FindDataByIndex(L,10));//通过给定下标查找   
    //ReplaceByIndex(L, i,i * 3);//通过给定下标替换   
    //ReplaceByData(L,8,110,1);//通过给定值替换   
    return 0;  
}   
//第一个节点为头节点,不存储有效数据   
LinkArray* New()  
{  
    LinkArray* L = (LinkArray*)malloc(sizeof(LinkArray));  
    L->data = 0;  
    L->next = NULL;  
    return L;   
}  
//增加   
void Add(LinkArray* L, Ele data)  
{  
    L->data ++;  
    while(L->next != NULL)  
    {  
        L = L->next;  
    }  
    L->next = New();  
    L->next->data = data;  
}  
//删除(通过给定值)  
int RemoveByData(LinkArray* L, Ele data)  
{  
    LinkArray* temp = L;  
    if(L->next == NULL)  
    {  
        return 0;  
    }  
    do  
    {  
        if(L->next->data == data)  
        {  
            temp->data--;  
            temp = L->next;  
            L->next = temp->next;  
            free(temp);  
            return 1;  
        }  
        L = L->next;  
    }  
    while(L->next != NULL);  
    return 0;  
}   
//删除(通过给定下标)  
int RemoveByIndex(LinkArray* L, int index)  
{  
    int i = 0;  
    LinkArray * temp = L;  
    if(index > L->data - 1)  
    {  
        return 0;  
    }  
    do  
    {  
        if(index == i)  
        {  
            temp->data --;  
            temp = L->next;  
            L->next = temp->next;  
            free(temp);  
            return 1;  
        }  
        L = L->next;  
        i++;  
    }  
    while(L->next != NULL);  
       
}   
//查找(通过给定数据查找第一个相匹配的数据的下标) (如果没有找到返回-1)   
int FindIndexByData(LinkArray* L, Ele data)   
{  
    int index = 0;  
    L = L->next;  
    while(L != NULL)  
    {  
        if(L->data == data)    
        {  
            return index;  
        }  
        L = L->next;  
        index++;   
    }   
    return -1;  
}  
//查找(通过下标查找相应的值) (如果没有就返回Ele默认值)   
Ele FindDataByIndex(LinkArray* L, int index)  
{  
    Ele data;  
    int i = 0;  
    if(index > L->data -1)  
    {  
        return data;  
    }   
    L = L->next;  
    while(L != NULL)  
    {  
        if(i == index)  
        {  
            return L->data;  
        }  
        L = L->next;  
        i++;  
    }  
    return data;  
}   
//修改(通过下标修改相应值)  
int ReplaceByIndex(LinkArray* L, int index, Ele value)  
{  
    int i = 0;  
    //下标越界   
    if(index > L->data -1)  
    {  
        return -1;  
    }   
    L = L->next;  
    while(L != NULL)  
    {  
        if(i == index)  
        {  
            L->data = value;   
            return 1;  
        }  
        L = L->next;  
        i++;  
    }  
    return -1;  
}   
//修改(把指定数据改为指定数据) (说明:如果replaceAll == 0,只替换第一个相匹配的,否则替换所有 )  
int ReplaceByData(LinkArray* L, Ele oldData, Ele newData, int replaceAll)   
{  
    int isReplaceOne = 0;  
    while(L->next != NULL)  
    {  
        L = L->next;  
        if(L->data == oldData)  
        {  
            isReplaceOne = 1;  
            L->data = newData;  
            if(replaceAll == 0)  
            {  
                return 1;  
            }  
        }  
    }  
    if(isReplaceOne)  
    {  
        return 1;  
    }  
    else  
    {  
        return 0;  
    }  
}  
//遍历   
void Traserval(LinkArray *L)  
{  
    printf("\n");  
    printf("Count = %d\n", Count(L));  
    L = L->next;  
    while(L != NULL)  
    {  
        printf("%d\n", L->data);  
        L = L->next;  
    }  
      
}   
//总数  
int Count(LinkArray *L)  
{  
    return L->data;  
}   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值