博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(续)线性表之双向链表(C语言实现)
阅读量:5942 次
发布时间:2019-06-19

本文共 5397 字,大约阅读时间需要 17 分钟。

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

双向链表与单链表差异,是双向链表结点中有前向指针和后向指针.所以在插入和删除新结点元素时候不见要考虑后向指针还要考虑前向指针.

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

1 #include
2 3 typedef struct node 4 { 5 int data; 6 struct node *next; 7 struct node *prior 8 }Node; 9 10 //链表的初始化 11 Node* InitList(int number) 12 { 13 int i; 14 Node *pHead=(Node *)malloc(sizeof(Node)); 15 Node *TempHead=pHead; 16 Node *Head=pHead; 17 Head->prior=NULL; 18 int data; 19 for(i=0;i
data=data; 25 pHead->next=NULL; 26 pHead->prior=TempHead; 27 TempHead->next=pHead; 28 TempHead=pHead; 29 } 30 return Head; 31 } 32 33 //显示链表 34 void ShowList(Node *Head) 35 { 36 37 Head=Head->next; 38 while(Head->next!=NULL) 39 { 40 printf("%d ",Head->data); 41 Head=Head->next; 42 } 43 printf("%d",Head->data); 44 printf("\n"); 45 } 46 47 //输出链表某个值的位置 48 int ListLocation(Node *Head,int data,int number) 49 { 50 Node *TempNode=Head; 51 int location=1; 52 TempNode=TempNode->next; 53 while(TempNode->next!=NULL) 54 { 55 if(TempNode->data==data) 56 { 57 return location; 58 } 59 location++; 60 TempNode=TempNode->next; 61 } 62 if(location>=number) 63 printf("Not found!"); 64 } 65 66 //输出链表某个位置的值 67 int ListData(Node *Head,int location,int number) 68 { 69 if(location>number) 70 printf("Not found!"); 71 72 Node *TempNode=Head; 73 TempNode=TempNode->next; 74 int i; 75 for(i=1;i<=number;i++) 76 { 77 if(location==i) 78 return TempNode->data; 79 TempNode=TempNode->next; 80 } 81 } 82 83 //头入法插入元素 84 void HeadInsertData(Node *Head,int data) 85 { 86 Node *InsertNode=(Node *)malloc(sizeof(Node)); 87 InsertNode->data=data; 88 InsertNode->next=Head->next; 89 Head->next->prior=InsertNode; 90 Head->next=InsertNode; 91 InsertNode->prior=Head; 92 } 93 94 //尾入插入除元素 95 void TailInsertData(Node *Head,int data) 96 { 97 Node *TempNode=Head; 98 Node *DeleteNode=(Node *)malloc(sizeof(Node)); 99 DeleteNode->data=data;100 while(TempNode->next!=NULL)101 TempNode=TempNode->next;102 103 TempNode->next=DeleteNode;104 DeleteNode->next=NULL;105 DeleteNode->prior=TempNode;106 107 free(DeleteNode);108 }109 110 111 112 //删除头结点113 void HeadDeleteData(Node *Head)114 {115 Head->next=Head->next->next;116 Head->next->prior=Head;117 }118 119 120 //删除尾结点121 void TailDeleteData(Node *Head)122 {123 Node *TempNode=Head;124 while(Head->next->next!=NULL)125 Head=Head->next;126 127 Head->next=NULL;128 Head->next->prior=NULL;129 }130 131 int main()132 {133 Node *Head;134 int number;135 printf("Please input the node number:\n");136 scanf("%d",&number);137 Head=InitList(number);138 printf("The initital list is:\n");139 ShowList(Head);140 141 int flag;142 printf("\n\n");143 printf("**********************Your Choice********************\n");144 printf("****************1-输出链表某个值的位置***************\n");145 printf("****************2-输出链表某个位置的值***************\n");146 printf("****************3-头入法插入元素*********************\n");147 printf("****************4-尾入法插入元素*********************\n");148 printf("****************5-删除头结点*************************\n");149 printf("****************6-删除尾结点*************************\n");150 printf("****************0-退出*******************************\n");151 printf("\n\n");152 printf("Please input flag:\n");153 scanf("%d",&flag);154 155 switch(flag)156 {157 case 1:158 {159 int data;160 printf("Please input the data you want locate:\n");161 scanf("%d",&data);162 int location;163 location=ListLocation(Head,data,number);164 printf("The data's location is: %d",location);165 break;166 }167 case 2:168 {169 int location;170 printf("Please input the location you want data:\n");171 scanf("%d",&location);172 int data;173 data=ListData(Head,location,number);174 printf("The location's data is: %d\n",data);175 break;176 }177 case 3:178 {179 int data;180 printf("Please input the data you want insert in head:\n");181 scanf("%d",&data);182 HeadInsertData(Head,data);183 ShowList(Head);184 break;185 }186 case 4:187 {188 int data;189 printf("Please input the data you want insert in tail:\n");190 scanf("%d",&data);191 TailInsertData(Head,data);192 ShowList(Head);193 break;194 }195 case 5:196 {197 HeadDeleteData(Head);198 ShowList(Head);199 break;200 }201 case 6:202 {203 TailDeleteData(Head);204 ShowList(Head);205 break;206 }207 case 7:208 {209 printf("You choose to exit.\n");210 break;211 }212 }213 return 0;214 }

 

结果图:

 

 

 

转载于:https://www.cnblogs.com/vpoet/p/4659719.html

你可能感兴趣的文章
oracle client server那点事
查看>>
坐飞机的一个现象
查看>>
SSH学习笔记(一)
查看>>
android:layout_weight的真实含义
查看>>
挂载磁盘
查看>>
[android] 练习样式主题自定义activity切换动画
查看>>
springmvc4之<mvc:exclude-mapping path="" />拦截配置
查看>>
深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局
查看>>
iOS之KVO
查看>>
数组的代替品
查看>>
Token 防盗链详解
查看>>
BZOJ-1878: [SDOI2009]HH的项链(莫队算法)
查看>>
Python3 定时访问网页
查看>>
两种算法解决查找子串的问题:hdu1711
查看>>
老板,让我们专注的工作【写给老板的一封信】
查看>>
LBS突围:从微信到微博
查看>>
SFB 项目经验-40-Skype for Business-呼入正常-呼出不正常
查看>>
吴忌寒江卓尔批“闪电网络”背后,是链圈和矿圈的的利益之争
查看>>
python的cls,self,classmethod,staticmethod
查看>>
应用系统中常见报表类型解析
查看>>