您的位置:首页 > 理论基础 > 数据结构算法

喜羊羊系列之数据结构双向链表

2015-04-11 15:25 316 查看
博客:http://blog.csdn.net/muyang_ren

关于双向链表的原理很多都有说明,我这只是与前面的内核链表作个对比,同样实现数据的增删差改。

截图:



1、main.c

#include "doublelist.h"

int main(void)
{
    int num, i;
    double_plist list;

    doublelist_init(&list);              //初始化双向链表
    
    printf("\n请输入链表长度:");
    scanf("%d",&num);
    
    //增
    printf("---------------- ① ----------------\n");
    printf("----------------增加----------------\n");
    for(i=1;i<=num;i++){  
        printf(">>> 增加 %d\n", i);
        doublelist_addnum(list,i);   //加入数据到双向链表
    }
    
    //查
    printf("---------------- ②  ----------------\n");
    printf("-----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据
    
    //删
    printf("---------------- ③  ----------------\n");
    printf("----------------删除----------------\n");
    printf("请输入要删除的数据\n");
    scanf("%d",&num);
    doublelist_del(list,num);
    
    //再查
    printf("----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据
    
    //修改
    printf("\n---------------- ④  ----------------\n");
    printf("----------------增加----------------\n");
    printf(">>>: n m ,则将 n 修改为 m\n");
    scanf("%d %d", &i, &num);
    doublelist_revise(list, i, num);             //显示双向链表内数据
    
    //再再查
    printf("----------------显示----------------\n");
    doublelist_show(list);             //显示双向链表内数据
   

    return 0;
}


2、头文件

doublelist.h

#ifndef __doubleLIST_H__
#define __doubleLIST_H__

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

typedef int datatype;
typedef struct doublelist{
    datatype data;
    struct doublelist *next, *prior;
}double_list,*double_plist;

extern void doublelist_new(double_plist * L); //增
extern void doublelist_init(double_plist * L);//初始化表头
extern void doublelist_show(double_plist l);//查
extern void doublelist_addnum(double_plist, int);
extern void doublelist_del(double_plist ,int);//删
extern void doublelist_revise(double_plist ,int , int );//改
#endif


3、双向链表实现函数

doublelist.c

#include "doublelist.h"

//开辟新的节点空间
void doublelist_new(double_plist *list){
    *list=(double_plist)malloc(sizeof(double_list));
    if(NULL == *list){
        perror("malloc\n");
        exit(-1);
    }
}

//双向链表初始化
void doublelist_init(double_plist *list){
    *list=(double_plist)malloc(sizeof(double_list));
    if(NULL == *list){
        perror("malloc\n");
        exit(-1);
    }
    (*list)->next=(*list)->prior=(*list);
}
//在双向链表表头添加节点并赋值
void doublelist_addnum(double_plist list,int num)
{
    double_plist new;

    doublelist_new(&new); //开辟新的空间给new
    new->data = num;
    
    new->prior=list->prior;
    new->prior->next=new;
    new->next=list;
    list->prior=new;
}

//查
//显示双向链表内数据
void doublelist_show(double_plist list)
{
    int i=1;
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        while(i++%6==0){
            printf("\n");
        }
        printf("%d\t",p->data);
    }
    printf("\n");
}

//删
void doublelist_del(double_plist list,int num)
{
    int flag=0;   //flag  找到删除点的标志位
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        //如果找到了链表对应的值
        if(num == p->data){
            p->prior->next=p->next;
            p->next->prior=p->next;
            flag=1;          //标志位置1;
            free(p);
       }
    }
    //如果没找到链表对应的值
    if(flag==0){
        printf("***在链表中没有找到对应的值***\n");
    }

}

//修改
void doublelist_revise(double_plist list,int old_num, int new_num)
{
    int flag=0;   //flag  找到删除点的标志位
    double_plist p;
    for(p=list->next; p!=list; p=p->next){
        //如果找到了链表对应的值
        if(old_num == p->data){
            p->data = new_num;
            flag=1;          //标志位置1;
        }
    }
    //如果没修改链表对应的值
    if(flag==0){
        printf("***在链表中没有找到对应的值***\n");
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: