双向链表的增删改查操作

原创 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
  • 734

双向链表的增删改查

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

双向链表的有关操作(创建,遍历,插入,删除)

#include #include #include using namespace std; typedef struct node {     int ans;     struct nod...
  • AC_Gibson
  • AC_Gibson
  • 2014年11月04日 19:34
  • 931

用c语言完成一个双向链表的创建,插入,删除

  • 2014年09月13日 08:47
  • 3KB
  • 下载

C语言实现链表的插入、删除、查询操作

前言本程序是数据结构上机实验内容,参考《数据结构(C语言版)》(清华大学出版社)中链表部分的伪代码实现。题目要求 设计链表结构体 建立一个链表,并录入n个原始数据 实现向链表中指定位置插入数据的功能 ...
  • lgj123xj
  • lgj123xj
  • 2017年05月08日 13:09
  • 965

双向链表实现 插入删除

#include "stdafx.h" #include "stdio.h" #include "stdlib.h" //双向链表 结点 typedef struct Node{ int dat...
  • xiangqiao123
  • xiangqiao123
  • 2012年04月23日 16:39
  • 910

第一次写C语言链表的增删改查

这是我第一次写链表的增加删除,学习数据结构,学习算法,是一个程序员必经之路,所以我来了,虽然还有很多的不足,但是这个代码就是一个基础,不仅会使我对php的理解更加深刻,而是我对程序有了另外一种看法,一...
  • baixiaoshi
  • baixiaoshi
  • 2015年07月06日 22:45
  • 2489

C++实现双链表的基本功能

双链表:在单链表的每个结点中,再设置一个指向其前驱结点的指针域 线性表的双向链表存储结构: typedef struct Node { DataType _data; s...
  • qq_34328833
  • qq_34328833
  • 2016年08月23日 14:13
  • 1984

C++实现双向链表的创建,插入,修改,删除

#include #include using namespace std; struct Node { int value; Node* pre; Node* next; }; c...
  • u012782049
  • u012782049
  • 2015年12月20日 22:26
  • 853

C例子:双向链表

  • 2015年06月14日 08:43
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:双向链表的增删改查操作
举报原因:
原因补充:

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