(续)线性表之双向链表(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
- (续)线性表之双向链表(C语言实现)
- C语言线性表之双向循环链表
- 线性表之循环链表、双向链表(三)--C语言实现
- C语言 双向循环链表的实现和结构 链表 线性表的链式实现
- 数据结构之---c语言实现双向链表操作
- 数据结构之双向链表(C语言实现)
- 双向链表代码实现-C语言
- 双向链表C语言实现
- C语言实现双向链表[上]
- C语言实现双向链表
- c语言双向链表的实现
- C语言实现双向循环链表
- C语言实现双向链表
- 双向链表的C语言实现
- C语言实现双向循环链表
- 【C语言】双向链表的实现
- C语言实现双向循环链表
- C语言实现双向循环链表
- 在游戏中使用keybd_event的问题
- 深入理解Linux内核--信号
- poj-2524 Ubiquitous Religions 并查集
- 2014新生暑假个人排位赛06
- Hdu1856 - More is better - 并查集
- (续)线性表之双向链表(C语言实现)
- java正则表达式
- 一网打尽当下NoSQL类型、适用场景及使用公司
- UVA 1511 Soju(贪心)
- Qemu Vhost Block架构分析(上)
- Help is needed for Dexter
- 如何用Maven创建web项目(具体步骤)
- 深入理解C++的动态绑定和静态绑定
- 爱心代码