双向链表的增删改查操作

原创 2012年03月27日 18:31:01

阿涛,你要认真对待每一件事,你要潇洒,你要做自己!

前面复习了单向链表和循环链表的操作,写得比较乱,现在写个比较规整的双向链表的的各项操作。

先上个截图:

双向链表的定义和好处我就不说了,说的再好也没有百度说的好,呵呵,何必再去浪费CSDN的服务器空间呢。

全部代码如下:

#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct DoubleLinkList)
typedef struct DoubleLinkList
{
    struct DoubleLinkList *previous;
    int num;
    struct DoubleLinkList *next;
}DB,*PDB;
void printInfo();
void CreatDoubleLinkList(int headNum);
void CreatNewDot(PDB *newDot,int num);
PDB SearchDot(int num);
void InsertDot(PDB dot,int AfterNum);
void DeleteDot(int num);
void ChangeDot(int originNum,int changeNum);
void DeleteAll();
PDB Head=NULL;
PDB newDot=NULL;
int inputNum=0;
int chanNum=0;
int order=-1;
int main()
{
    do
    {
    printf("***********************命令菜单***************************\n");
    printf("***                                                    ***\n");
    printf("***********************1:创建双向链表头节点***************\n");
    printf("***                                                    ***\n");
    printf("***********************2:创建新节点***********************\n");
    printf("***                                                    ***\n");
    printf("***********************3:改变节点值***********************\n");
    printf("***                                                    ***\n");
    printf("***********************4:删除节点*************************\n");
    printf("***                                                    ***\n");
    printf("***********************5:打印现在列表的值*****************\n");
    printf("***                                                    ***\n");
    printf("***********************6:释放链表所有节点*****************\n");
    printf("***                                                    ***\n");
    printf("***********************7:退出程序*************************\n");
    printf("请输入命令:\n");
    scanf("%d",&order);
    switch(order)
    {
        case 1:
            printf("请输入头结点的值:\n");
            scanf("%d",&inputNum);
            CreatDoubleLinkList(inputNum);
        break;
        case 2:
            printf("请输入新结点的值:\n");
            scanf("%d",&inputNum);
            CreatNewDot(&newDot,inputNum);
            printf("请输入你要插在那个节点之后:\n");
            scanf("%d",&inputNum);
            InsertDot(newDot,inputNum);
        break;
        case 3:
            printf("请输入要改变的节点的原来的值:\n");
            scanf("%d",&inputNum);
            printf("请输入要改变后值:\n");
            scanf("%d",&chanNum);
            ChangeDot(inputNum,chanNum);
        break;
        case 4:
            printf("输入要删除的节点的值:\n");
            scanf("%d",&inputNum);
            DeleteDot(inputNum);
        break;
        case 5:
            printInfo();
        break;
        case 6:
            DeleteAll();
         break;
        default:
        break;
    }

    }while(order!=7);

    return 0;
}
void printInfo()
{
    if(Head==NULL)
    {
        printf("链表为空!\n");
        return ;
    }
    PDB pOut=Head;
    printf("链表值为:\n");
    do{
        printf("%d\n",pOut->num);
        pOut=pOut->next;
      }while(pOut->next!=Head->next);
}
void CreatDoubleLinkList(int headNum)
{
    Head=(PDB)malloc(LEN);//必须申请内存空间,不然报错,如果没有初始化为NULL,又没有分配空间,后果和严重,令CodeBlocks休克了
    Head->num=headNum;
    Head->next=Head->previous=Head;
    printf("双向链表的头结点已经创建,值为:%d\n",Head->num);
}
void CreatNewDot(PDB *newDot,int number)
{
    //指针作为参数,为指针参数申请内存空间,
    //必须使用双指针,实参为指针的引用,
    //否则参数指针不会被分配空间,并且引起内存泄露,无法free掉
     (*newDot)=(PDB)malloc(LEN);
     (*newDot)->num=number;
}
PDB SearchDot(int num)
{
    if(Head==NULL)
    {
        printf("链表为空,没有可以删除的节点!\n");
        return NULL;
    }
    else if(Head->num==num)
    {
        return Head;
    }
    else
    {
        PDB search=Head->next;
        while(search->num!=num&&search!=Head)
        {
            search=search->next;
        }
        if(search==Head)
        return NULL;
        else
        return search;
    }
    return NULL;
}
void InsertDot(PDB dot,int AfterNum)
{
    if(dot==NULL)
    return ;
    else
    {
        PDB AfterDot=SearchDot(AfterNum);
        dot->previous=AfterDot;
        dot->next=AfterDot->next;
        AfterDot->next->previous=dot;
        AfterDot->next=dot;
    }
    printf("数据插入成功!\n");
}
void DeleteDot(int num)
{
    PDB delDot=SearchDot(num);
    if(delDot==NULL)
    {
        printf("节点不存!\n");
        return ;
    }
    delDot->previous->next=delDot->next;
    delDot->next->previous=delDot->previous;
    free(delDot);
    printf("节点删除成功!\n");
}
void ChangeDot(int originNum,int changeNum)
{
    PDB chanDot=SearchDot(originNum);
    if(chanDot==NULL)
    {
        printf("不存在节点值为:%d 的节点!\n",originNum);
        return ;
    }
    else
    {
        chanDot->num=changeNum;
         printf("节点值更改成功!\n");
    }

}

void DeleteAll()
{
    if(Head==NULL)
    {
        printf("链表为空,不需要释放!\n");
        return ;
    }
    PDB del=NULL;
    while(Head->next!=Head)
    {
        del=Head->next;
        Head->next=del->next;
        del->next->previous=Head;
        free(del);
    }
    if(Head!=NULL)
    free(Head);
    Head=NULL;

    printf("链表释放完毕!");
}

有不对的地方请大家指正,有疑问请给阿涛留言,谢谢!

相关文章推荐

双向链表的增删改查

// // Created by yex on 2016/12/13. // #ifndef DOUBLELINK_DOUBLELINK_H #define DOUBLELINK_DOUBLELIN...
  • szqsdq
  • szqsdq
  • 2016年12月13日 11:40
  • 568

利用mybatis实现增删改查 的小项目,单表,双表一对多,

1.我们已经在自己的数据库中建立好了将要展示的三个表,并添加好了某些数据 user表:CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INC...

双链表:实现基本的增删查改,正反向现实双链表的节点

声明部分,头文件 list.h#include #include //双链表节点 typedef struct LinkNode { int data; struct LinkNode *pP...

C语言双链表,可实现增删改查功能,还可以将链表反转。

#include #include #include int  number=0; typedef struct Node { int data; struct Node *next; struct ...

双向链表的增删改查

  • 2014年03月16日 12:14
  • 1KB
  • 下载

java链表之--java双向链表的增删改查

单向链表只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点)。鉴于上述问题,引入了双向链表。由于双向循环链表包含双向链表的所有功能操作。因此,我们只讲...
  • basycia
  • basycia
  • 2016年07月06日 15:27
  • 316

用java实现双向循环链表的增删改查

用java实现双向循环链表的增删改查

java链表结构(单向、双向的增删改查)

链表介绍 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 链表与数组的区别 链表和...
  • pengkv
  • pengkv
  • 2015年05月08日 10:51
  • 1507

单链表c语言实现增删改查操作

  • 2012年09月21日 18:16
  • 1.97MB
  • 下载

Linux内核双向链表的增删查操作

一、概述        Linux内核中大量使用了链表这个基本数据结构,因此有必要去窥探一下其“葫芦里卖的是什么药”。先来些基本知识点吧: 1.数据元素间是一对一关系; 2.链表中的元素个数是有...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双向链表的增删改查操作
举报原因:
原因补充:

(最多只允许输入30个字)