单链表(带表头)
来源:互联网 发布:更新ios6的软件 编辑:程序博客网 时间:2024/05/29 14:46
链表的创建插入删除遍历逆序等操作
//链表节点创建typedef struct Node{ int data; //数据域 struct Node *Next;//指针域}NODE, *LinkList;
//链表节点初始化data为-1NODE *ListInit(){ NODE *pNode; pNode = (NODE*)malloc(sizeof(NODE)); if (pNode == NULL){} pNode->Next = NULL; pNode->data = -1; return pNode;}
//链表元素的尾插NODE* InsertEnd(NODE *pHead,int value){ NODE *node = (NODE*)malloc(sizeof(NODE)); if (node!=NULL) { NODE *current = pHead; while (current->Next!=NULL) { current = current->Next; } node->data = value; node->Next = current->Next; current->Next = node; return pHead; }}
//链表元素的头插NODE* InsertFront(NODE *pHead, int value){ NODE *node = (NODE*)malloc(sizeof(NODE)); if (node != NULL) { NODE *current = pHead; node->Next = current->Next; node->data = value; current->Next = node; return pHead; }}
//删除链表中为value的节点,所有的valueNODE* RemoveNode(NODE* pHead,int value){ if (!pHead) { return pHead; } NODE *current = pHead->Next; NODE *pre = pHead; while (current!=NULL) { if (current->data == value) { NODE* node = current; current = current->Next; pre->Next = current; free(node); node = NULL; } else { current = current->Next; pre = pre->Next; } } return pHead;}
//遍历链表void PrintList(NODE * pHead){ if (!pHead) { printf("list is NULL\n"); return; } NODE* current = pHead->Next;//头结点的下一个节点 //NODE* current = pHead; while (current!=NULL) { printf(" %d, ", current->data); current = current->Next; } printf("\n");}
//递归逆序打印void ReversePrintList(NODE * pHead){ if (pHead != NULL) { if (pHead->Next!=NULL) ReversePrintList(pHead->Next); printf(" %d, ", pHead->data); }}
//获取链表的长度int GetListLength(NODE *phead){ if (!phead) { return 0; } NODE *current = phead->Next;//不算头节点 int length = 0; while (current != NULL) { length++; current = current->Next; } return length;}
//链表的逆序//创建一个尾节点,从头节点的下一个节点开始一个一个指向尾节点,最终将头节点指向原来的尾节点NODE *ReverseList(NODE *pHead) { if (!pHead||!pHead->Next) { return pHead; } NODE *prev= NULL; //左节点 NODE *current = pHead->Next; //中间节点 NODE *ptmp = NULL; //右节点 while (current!=NULL) { ptmp = current->Next; if (ptmp==NULL) //原链表的尾节点 { pHead->Next = current; } current->Next = prev; prev = current; current = ptmp; } return pHead;}
//链表释放void ReleaseList(NODE **pHead){ NODE *tmp = *pHead; if (*pHead==NULL) { printf("list is empty\n"); return; } while (*pHead!=NULL) { tmp = *pHead; *pHead = (*pHead)->Next; free(tmp); }}//调用方法ReleaseList(&List1);
//vs2013测试程序int _tmain(int argc, _TCHAR* argv[]){ NODE* List = ListInit(); for (int i = 0; i < 10; i++) { List = InsertEnd(List, i); List = InsertEnd(List, i); //List = InsertFront(List, i); PrintList(List); printf("list length = %d, ", GetListLength(List)); printf("\n"); List = RemoveNode(List, 9); PrintList(List); printf("list length = %d, ", GetListLength(List)); printf("\n"); printf("逆序\n"); List = ReverseList(List); PrintList(List); //ReversePrintList(List); printf("\n"); system("pause"); return 0;}
//运行结果0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,list length = 200,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,list length = 18逆序8,8,7,7,6,6,5,5,4,4,3,3,2,2,1,1,0,0,
//两个链表合并NODE *MergeList(NODE *pHead1, NODE *pHead2){ if (pHead1 == NULL) return pHead2; else if (pHead2 == NULL) return pHead1; NODE *pMergedHead = NULL; if (pHead1->data < pHead2->data) { pMergedHead = pHead1; pMergedHead->Next = MergeList(pHead1->Next, pHead2); } else { pMergedHead = pHead2; pMergedHead->Next = MergeList(pHead1, pHead2->Next); } return pMergedHead;}
int main(){ NODE* List1 = ListInit(); NODE* List2 = ListInit(); NODE* List3 = NULL; for (int i = 1; i < 10; i++) { List1 = InsertEnd(List1,i); } for (int i = 2; i < 10; i++) { List2 = InsertEnd(List2,i); } PrintList(List1); PrintList(List2); List3 = MergeList(List1, List2); PrintList(List3); system("pause"); return 0;}
阅读全文
1 0
- 单链表(带表头)
- 单链表的逆序(不带表头)
- 不带表头节点的单链表编程(1)
- 不带表头节点的单链表编程(2)
- 带表头结点的单链表ADT_HeaderList
- 【链表】单链表——带表头结点
- 带表头节点的单链表编程
- 数据结构之带表头的单链表
- C++实现带表头的单链表
- 西卡学院单链表的实现(带空表头的实现)
- 带表头的单链表算法分析(前插法示例,C语言实现)
- 链表(单链表,带表头的链表,单向循环链表,双向循环链表)
- 链表 带表头 循环
- 链表 带表头 循环
- 带表头链表
- 单链表(表头结点)
- 【链表】单链表——不带表头结点
- 带表头的单向链表实现(C语言)
- vim命令
- 什么是ARM中的SP(堆栈)和LR?
- Java多线程--并发中集合的使用之ArrayBlockingQueue
- mysql分库分表方案浅析
- quartz定时任务框架调度机制解析
- 单链表(带表头)
- Django 基础
- 单调栈的总结
- av_write_frame()
- JavaSE学习----StringBuffer/StringBuilder类
- [安全漏洞公告专区]RHSA-2017:1615: kernel security and bug fix update漏洞预警及修复办法
- VGGNet 《VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION》学习笔记
- 在 Chrome 中清除、启用和管理 Cookie
- 9.8 遇到的一些问题 maven部署项目,mysql区分大小写