双链表
来源:互联网 发布:仙界网络直播间txt网盘 编辑:程序博客网 时间:2024/06/05 18:05
双链表:
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
双链表的一些基本操作函数的声明:
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct Node { int data; struct Node * next; struct Node * prior;}Node, *Pnode;Pnode create_list(void); //创建节点void traverse_list(Pnode pHead); //遍历链表打印 void fantraverse_list(Pnode pHead);int ListLength(Pnode pHead);Pnode ListInsert(Pnode pHead); Pnode ListDelete(Pnode pHead, int x);Pnode ListSort(Pnode pHead); void ListClear(Pnode pHead);
创建双链表的历程:
Pnode create_list(void){ int i, len; Pnode pHead, pTemp; pHead = (Pnode)malloc(sizeof(Node)); Pnode pNew; if(NULL == pHead){ printf("内存分配出错!\n"); exit(1); } pHead = pTemp; pTemp->next = NULL; printf("请输入你想要的链表的长度:"); scanf("%d", &len); for(i = 0; i < len; i++){ pNew = (Pnode)malloc(sizeof(Node)); if(NULL == pNew){ printf("新节点内存分配出错。\n"); exit(1); } printf("请输入新节点的值:"); scanf("%d", &pNew->data); pTemp->next = pNew; pNew->prior = pTemp; pNew->next = NULL; pTemp = pNew; } (pHead->next)->prior = NULL; return pHead;}
由前向后遍历:
void traverse_list(Pnode pHead){ Pnode pTemp = pHead->next; if(pTemp == NULL){ printf("链表为空。\n"); } else{ printf("由前到后链表的值分别是:"); while(pTemp){ printf("%d ", pTemp->data); pTemp = pTemp->next; } } printf("\n"); }
由后向前遍历:
void fantraverse_list(Pnode pHead){ Pnode pTemp = pHead->next; if(pTemp == NULL){ printf("链表为空。\n"); exit(1); } while(pTemp->next != NULL){ pTemp = pTemp->next; } printf("由后到前链表的值分别是:"); while(pTemp){ printf("%d ", pTemp->data); pTemp = pTemp->prior; } printf("\n");}
插入历程:
Pnode ListInsert(Pnode pHead){ int x; printf("请输入你想在那个值得前面或后面插:"); scanf("%d", &x); Pnode pTemp = pHead->next; Pnode pInsert, pTemp2; while(pTemp && pTemp->data != x){ pTemp = pTemp->next; } if(pTemp == NULL){ printf("在链表中没有找到%d的值。\n", x); return pHead; } else{ pInsert = (Pnode)malloc(sizeof(Node)); int s; printf("请输入要插入元素的值:"); scanf("%d", &pInsert->data); printf("请选择插在%d之前还是之后。(“0”前“1”后)", x); do{ scanf("%d", &s); if(s == 0){ if(pTemp->prior == NULL){ pHead->next = pInsert; pTemp->prior = pInsert; pInsert->next = pTemp; pInsert->prior = NULL; break; } pTemp2 = pTemp->prior; pInsert->next = pTemp; pInsert->prior = pTemp2; pTemp2->next = pInsert; pTemp->prior = pInsert; } if(s == 1){ if(pTemp->next == NULL){ pTemp->next = pInsert; pInsert->prior = pTemp; pInsert->next = NULL; break; } pTemp2 = pTemp->next; pInsert->next = pTemp2; pInsert->prior = pTemp; pTemp->next = pInsert; pTemp2->prior = pInsert; } }while(!(s == 0 || s == 1)); } return pHead;}
删除历程:
Pnode ListDelete(Pnode pHead, int x){ Pnode pTemp = pHead; while(pTemp->next && pTemp->next->data != x){ pTemp = pTemp->next; } if(pTemp->next == NULL){ printf("链表中没找到%d。\n", x); return pHead; } Pnode pTemp2 = pTemp->next; if(pTemp2 == pHead->next){ pHead->next = pTemp2->next; (pTemp2->next)->prior = NULL; } else if(pTemp2->next == NULL){ pTemp->next = NULL; } else{ Pnode pTemp2 = pTemp->next; pTemp->next = pTemp2->next; (pTemp2->next)->prior = pTemp; } free(pTemp2); return pHead;}
链表排序:
Pnode ListSort(Pnode pHead){ Pnode pFirst; Pnode pMin; Pnode pFmin; Pnode pTail; Pnode pTemp; Pnode pTemp2; if(pHead->next == NULL){ printf("链表为空!\n"); return pHead; } if(pHead->next->next == NULL){ printf("只有一组数据无需排序"); } pFirst = NULL; while(pHead->next != NULL){ for(pTemp = pHead, pMin = pHead->next; pTemp->next != NULL; pTemp = pTemp->next){ if(pMin->data > pTemp->next->data){ pFmin = pTemp; pMin = pTemp->next; } } if(pFirst == NULL){ pFirst = pMin; pFirst->prior = NULL; pTail = pMin; } else{ pTail->next = pMin; pMin->prior = pTail; pTail = pMin; } if(pHead->next == pMin) pHead->next = pMin->next; else pFmin->next = pMin->next; } pTail->next = NULL; pHead->next = pFirst; return pHead;}
销毁链表
void ListClear(Pnode Phead){ Pnode pTemp = Phead; Pnode pTemp2; while(pTemp != NULL){ pTemp2 = pTemp->next; free(pTemp); pTemp = pTemp2; }}
一个测试 函数:
int main(void){ Pnode head = create_list(); traverse_list(head); fantraverse_list(head); printf("链表的长度是:%d\n", ListLength(head)); head = ListInsert(head); traverse_list(head); fantraverse_list(head); int x; printf("请输入你想删除的值:"); scanf("%d", &x); head = ListDelete(head, x); traverse_list(head); fantraverse_list(head); printf("排序后的链表:"); head = ListSort(head); traverse_list(head); fantraverse_list(head); ListClear(head); return 0;}
有几个函数没写^.^
0 0
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- 双链表
- Notepad++的打开方式
- css基础入门2
- effective java 读书笔记---第8章 通用程序设计
- 何如高效理解递归问题
- html表格
- 双链表
- springmvc 资源解决办法
- 《全球顶尖公司的领导力实践》——读书随笔
- 动态规划专题之----213. House Robber II
- UE4学习笔记
- 135.杀死进程
- ARM汇编基础
- 十大排序算法实现
- OpenGL编程中遇到error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12等问题