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

来源:互联网 发布:感情淡了 知乎 编辑:程序博客网 时间:2024/03/29 02:39

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

双向链表的基本操作.


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

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

前向指针.



以下是双向链表的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;}

结果图:




转载请注明作者:小刘

1 0