双向链表相关


数据结构

valgrind ./a.out

  1.定义
     一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)
     
     程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,
     并在此基础上实现某个特定的功能的操作;

    程序 = 数据结构 + 算法
    

     
  2.数据与数据之间的关系 
  
    数据的逻辑结构:数据元素与元素之间的关系
           集合:关系平等
           线性结构:元素之间一对一的关系(表(数组,链表),队列。栈。。。)
           树型结构:元素之间一对多的关系(二叉树)
           图形结构:元素之间多对多的关系(网状结构)
        
    数据的物理结构:数据的逻辑结构在计算机内存中的存储形式
    
            顺序存储:采用一段连续的内存空间保存元素
            
                    优点:空间连续,访问方便
                    缺点:插入删除需要移动大量的元素
                          需要预分配内存空间
                          容易造成存储空间碎片
            
            链式存储:采用一组非连续的内存空间保存元素
                    
                    缺点:访问元素效率低
                    
                    优点:插入和删除数据方便
                          不需要预分配内存
            
            索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置
            散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对
                     应关系从而实现查找的存储方式
                          
    
   3. 储备知识
       指针
       结构体
       动态内存分配

main函数

#include "../head.h"
#include "double_link.h"


int main()
{
    DouLink *dlink = Created_link();
    if(dlink == NULL)
    {
        return -1;
    }
    DataType stus[] = {
        {1,"zhangsan",18,90},
        {2,"lisi",11,70},
        {3,"wangwu",28,58},
        {4,"maliu",22,60},
    };
    
    push_doulink_head(dlink,stus[0]);
    push_doulink_head(dlink,stus[1]);
    push_doulink_head(dlink,stus[2]);
    push_doulink_head(dlink,stus[3]);
    push_data_end(dlink,stus[0]);
    Transfer_dlink(dlink);
    Find_data(dlink,"lisi") ;//查找
  //  Change_data(dlink,"zhangsan",stus[1]);
  //  Transfer_dlink(dlink);
    destory_dlink(dlink);
}

double_link.c

#include "../head.h"
#include "double_link.h"
DouLink *Created_link() // 创建
{
    DouLink *dlink = malloc(sizeof(DouLink));
    if(dlink == NULL)
    {
        perror("create fail");
        return NULL;
    }

    dlink->clen = 0;
    dlink->phead = NULL;
    
    
    return dlink;
}

int push_doulink_head(DouLink *dlink,DataType data) //头插
{
    if(NULL == dlink)
    return -1;
    
    DouNode *pinsert = malloc(sizeof(DouNode));
    
    if(pinsert == NULL)
    {
        perror("create fail");
        return -1;
    }
    
    pinsert->ppre = NULL;
    pinsert->pnext =dlink->phead;
    pinsert->data = data;
    dlink->clen++;
    
    if(dlink->phead != NULL)
    {
        dlink->phead->ppre = pinsert;
    }

    dlink->phead = pinsert;

}

int Transfer_dlink(DouLink *dlink) //遍历
{
    if(NULL == dlink)
    return -1;
    DouNode *pnode = dlink->phead;
    
    while(pnode->pnext != NULL)
    {
        printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
        pnode = pnode->pnext;
    }
    
    printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
    
    printf("====\n");
    /*
    while(pnode != NULL)
    {    
        printf("id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
        pnode = pnode->ppre;
    }
    */
}
int push_data_end(DouLink *dlink,DataType data) //尾插
{
    if(dlink == NULL)
    return -1;
    DouNode *p = dlink->phead;
    DouNode *pnode = malloc(sizeof(DouNode));
    if(pnode == NULL)
    {
        perror("malloc fail");
        return -1;
    }
    if(dlink->phead == NULL)
    {
        pnode->data = data;
        pnode->pnext = NULL;
        pnode->ppre = NULL;
        dlink->phead = pnode;
    }
    else
    {
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        pnode->data = data;
        pnode->pnext = NULL;
        pnode->ppre = p;
        p->pnext = pnode;
    }
    dlink->clen++;
}
int del_head(DouLink *dlink)//头删
{
    if(dlink == NULL || dlink->phead == NULL)
    return -1;
    DouNode *pnode = dlink->phead;
    if(pnode->pnext == NULL)
    {
        dlink->phead = NULL;
        free(pnode);
        dlink->clen--;
    }
    else
    {
        pnode->pnext->ppre = NULL;
        dlink->phead = pnode->pnext;
        free(pnode);
        dlink->clen--;
    }
}
int del_end(DouLink *dlink) // 尾删
{
    if(dlink == NULL || dlink->phead == NULL)
    return -1;
    DouNode *pnode = dlink->phead;
    if(pnode->pnext == NULL)
    {
        free(pnode);
        dlink->phead = NULL;
        dlink->clen--;
    }
    else
    {
        while(pnode->pnext != NULL)
        {
            pnode = pnode->pnext;
        }
        pnode->ppre->pnext = NULL;
        free(pnode);
        dlink->clen--;
    }
}
int Change_data(DouLink *dlink , char *name , DataType targe)//制定删除
{
    if(dlink == NULL || dlink->phead == NULL)
    return -1;
    DouNode *p = dlink->phead;
    while(p != NULL)
    {
        if(!strcmp(p->data.name,name))
        {
            p->data = targe;
            return -1;
        }
        p = p->pnext;
    }
}
int Find_data(DouLink *dlink,char *name) //查找
{
    if(dlink == NULL || dlink->phead == NULL)
    return -1;
    DouNode *pnode = dlink->phead;
    while(pnode != NULL)
    {
        if(!strcmp(pnode->data.name,name))
        {
            printf("查找id : %d-name:%s-age:%d-score:%d\n",pnode->data.id,pnode->data.name,pnode->data.age,pnode->data.score);
            return -1;
        }
        pnode = pnode->pnext;
    }
    printf("No find\n");
    return 0;

}
int destory_dlink(DouLink *dlink)
{
    if(dlink == NULL || dlink->phead == NULL)
    return -1;
    while(dlink->phead != NULL)
    {
        
        del_head(dlink);
    }
    free(dlink);


}
/*************************************************************************
	> File Name: double_link.h
	> Author: yas
	> Mail: rage_yas@hotmail.com
	> Created Time: Thu 08 Aug 2024 04:19:05 PM CST
 ************************************************************************/

#ifndef __DOUBLE_LINK_H__
#define __DOUBLE_LINK_H__
typedef struct stu
{
    int id;
    char name[100];
    int age;
    int score;
}DataType;

typedef struct node
{
    DataType data;
    struct node *ppre;
    struct node *pnext;

}DouNode;
typedef struct link
{
    DouNode *phead;
    int clen;

}DouLink;

DouLink *Created_link();

int push_doulink_head(DouLink *dlink,DataType data);
int Transfer_dlink(DouLink *dlink);
int push_data_end(DouLink *dlink,DataType data); //尾插
int del_head(DouLink *dlink);//头删
int del_end(DouLink *dlink) ; // 尾删
int Change_data(DouLink *dlink , char *name , DataType targe);
int Find_data(DouLink *dlink,char *name) ;//查找
int destory_dlink(DouLink *dlink);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值