(续)线性表之双向链表(C语言实现)

在前文实现单向链表的基本操作下,本文实现

双向链表的基本操作.

双向链表与单链表差异,是双向链表结点中有前向指针和后向指针.

所以在插入和删除新结点元素时候不见要考虑后向指针还要考虑

前向指针.

以下是双向链表的C代码:

#include<stdio.h>

typedef struct node
{
    int data;
    struct node *next;
    struct node *prior
}Node;

//链表的初始化
Node* InitList(int number)
{
    int i;
    Node *pHead=(Node *)malloc(sizeof(Node));
    Node *TempHead=pHead;
    Node *Head=pHead;
    Head->prior=NULL;
    int data;
    for(i=0;i<number;i++)
    {
        pHead=(Node *)malloc(sizeof(Node));
        printf("Please input the %dst node data:\n",i+1);
        scanf("%d",&data);
        pHead->data=data;
        pHead->next=NULL;
        pHead->prior=TempHead;
        TempHead->next=pHead;
        TempHead=pHead;
    }
    return Head;
}

//显示链表
void ShowList(Node *Head)
{

    Head=Head->next;
    while(Head->next!=NULL)
    {
        printf("%d ",Head->data);
        Head=Head->next;
    }
    printf("%d",Head->data);
    printf("\n");
}

//输出链表某个值的位置
int ListLocation(Node *Head,int data,int number)
{
    Node *TempNode=Head;
    int location=1;
    TempNode=TempNode->next;
    while(TempNode->next!=NULL)
    {
        if(TempNode->data==data)
            {
                return location;
            }
            location++;
            TempNode=TempNode->next;
    }
    if(location>=number)
        printf("Not found!");
}

//输出链表某个位置的值
int ListData(Node *Head,int location,int number)
{
    if(location>number)
        printf("Not found!");

    Node *TempNode=Head;
    TempNode=TempNode->next;
    int i;
    for(i=1;i<=number;i++)
    {
        if(location==i)
            return TempNode->data;
        TempNode=TempNode->next;
    }
}

//头入法插入元素
void HeadInsertData(Node *Head,int data)
{
    Node *InsertNode=(Node *)malloc(sizeof(Node));
    InsertNode->data=data;
    InsertNode->next=Head->next;
    Head->next->prior=InsertNode;
    Head->next=InsertNode;
    InsertNode->prior=Head;
}

//尾入插入除元素
void TailInsertData(Node *Head,int data)
{
    Node *TempNode=Head;
    Node *DeleteNode=(Node *)malloc(sizeof(Node));
    DeleteNode->data=data;
    while(TempNode->next!=NULL)
        TempNode=TempNode->next;

    TempNode->next=DeleteNode;
    DeleteNode->next=NULL;
    DeleteNode->prior=TempNode;

    free(DeleteNode);
}

//删除头结点
void HeadDeleteData(Node *Head)
{
    Head->next=Head->next->next;
    Head->next->prior=Head;
}

//删除尾结点
void TailDeleteData(Node *Head)
{
    Node *TempNode=Head;
    while(Head->next->next!=NULL)
        Head=Head->next;

    Head->next=NULL;
    Head->next->prior=NULL;
}

int main()
{
    Node *Head;
    int number;
    printf("Please input the node number:\n");
    scanf("%d",&number);
    Head=InitList(number);
    printf("The initital list is:\n");
    ShowList(Head);

    int flag;
    printf("\n\n");
    printf("**********************Your Choice********************\n");
    printf("****************1-输出链表某个值的位置***************\n");
    printf("****************2-输出链表某个位置的值***************\n");
    printf("****************3-头入法插入元素*********************\n");
    printf("****************4-尾入法插入元素*********************\n");
    printf("****************5-删除头结点*************************\n");
    printf("****************6-删除尾结点*************************\n");
    printf("****************0-退出*******************************\n");
    printf("\n\n");
    printf("Please input flag:\n");
    scanf("%d",&flag);

    switch(flag)
    {
        case 1:
        {
            int data;
            printf("Please input the data you want locate:\n");
            scanf("%d",&data);
            int location;
            location=ListLocation(Head,data,number);
            printf("The data's location is: %d",location);
            break;
        }
        case 2:
        {
            int location;
            printf("Please input the location you want  data:\n");
            scanf("%d",&location);
            int data;
            data=ListData(Head,location,number);
            printf("The location's data is: %d\n",data);
            break;
        }
        case 3:
        {
            int data;
            printf("Please input the data you want insert in head:\n");
            scanf("%d",&data);
            HeadInsertData(Head,data);
            ShowList(Head);
            break;
        }
        case 4:
        {
            int data;
            printf("Please input the data you want insert in tail:\n");
            scanf("%d",&data);
            TailInsertData(Head,data);
            ShowList(Head);
            break;
        }
        case 5:
        {
            HeadDeleteData(Head);
            ShowList(Head);
            break;
        }
        case 6:
        {
            TailDeleteData(Head);
            ShowList(Head);
            break;
        }
        case 7:
        {
           printf("You choose to exit.\n");
           break;
        }
    }
    return 0;
}

结果图:

转载请注明作者:小刘

(续)线性表之双向链表(C语言实现),布布扣,bubuko.com

时间: 2024-10-26 21:58:26

(续)线性表之双向链表(C语言实现)的相关文章

[数据结构 - 第3章补充] 线性表之双向链表(C语言实现)

一.什么是循环链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱. 既然单链表也可以有循环链表,那么双向链表当然也可以是循环表. 线性表的双向链表存储结构如下: typedef int ElemType; typedef struct DulNode { ElemType data; //数据域 DulNode *prior; //指向前驱结点的指针 DulN

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

数据结构与算法-线性表之双向链表

参考博客: http://www.cnblogs.com/skywang12345/p/3561803.html https://blog.csdn.net/howlaa/article/details/38513235 1.概述 线性表是一种线性结构,由数组.单项链表和双向链表组成,这里讲讨论双向链表的理论知识和实现代码. 双向链表和单项链表类似,双向链表由两个指针作为指针域,分别指向前驱节点和后驱节点.可以从任何节点开始向前或者向后删除.增加.查找节点. 双链表的示意图如下: 在插入节点的时

线性表之双向链表

一,双向链表的基础知识 1.双向链表的概念 双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表的每个结点中都有两个指针域,一个指向其前驱结点,一个指向其后继结点. 2.双向链表实现的难点 每一个数据元素有两个指针域,一个指向其前驱结点,一个指向其后继结点. 第一个结点的前驱为NULL,最后一个节点的后继为NULL. 二,双向链表的实现 1.双向链表的基本功能(DoubleLinkList.h) # ifndef DOUBLE_LINK_LIST # define D

数据结构之—线性表之—双向链表之—浅谈双循环链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点.一般我们都构造双向循环链表. /********************************************************************** * Copyright (c)2015,WK Studios * Filename: Tw_Node.c * Compiler: GCC,VS,VC6.

几种常见的线性表存储结构

1.线性表的的动态分配顺序存储结构 1 #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 2 #define LISTINCREMENT 100 //线性表存储空间的分配增量 3 typedef struct { 4 ElemType *elem; //存储空间基址 5 int length; //当前长度 6 int size; //当前分配的存储容量 7 }SqList; //动态分配 + 顺序存储结构 2.线性表的单链表存储结构 1 typedef st

线性表.04.链式存储结构(双向循环链表)

以下是用双向循环链表实现的线性表 #include <stdio.h> #include <stdlib.h> #include <time.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int ElemType;//ElemType这里假设为int,可以根据需要进行更改 typedef int Status;//Status是函数的类型,其值是函数结果状态代码,如OK等 t

线性表(List) 二

线性表的链式存储结构 概念 为了表示每个数据元素 ai 与其直接后继元素 ai+1 之间的逻辑关系,对于数据元素 ai 来说,除了要存储其本身的信息之外,还需要存储一个指示其直接后继的信息(即直接后继的物理位置). 将存储数据元素信息的域称为数据域,把存储直接后继位置的域成为指针域.指针域中存储的信息成为指针或链,这两个部分信息组成数据元素 ai 的存储映像,称为结点(Node). n个结点( ai 的存储映像)链结成一个链表,即为线性表 a1,a2,...,an 的链式存储结构,因此此链表的每

线性表--链表(PHP实现)

上一篇文章写了线性表的基本概念以及用C语言实现链表,有兴趣的同学可以看看:线性表--链表(C语言实现). 现在,我们来看看用PHP来实现链表. 我们都知道,链表由一个个结点组成.在c语言中,我们用结构来定义一个结点,那么在PHP中我们用什么来定义结点? 当然是类. <?php //用面向对象的思想定义结点 class Node { public $value; public $next = null; } 先给出创建和遍历链表的代码,我们再说说链表的插入和删除操作,比起用顺序存储结构实现线性表的