数据结构:线性表的链式存储结构_单链表
2015-06-11 15:08
357 查看
1.单链表的存储结构定义
单链表:由n个结点链接成的,结点由数据域和指针域两部分组成,指针指向链表的下一个结点。头指针:我们把链表中的第一个结点的存储位置,整个链表的存取就必须是从头指针开始进行了。同时,我们规定链表的最后一个结点的指针域为NULL。
头结点:有时为了操作方便,会在单链表的第一个结点前附设一个结点,该节点就是头结点。头结点的数据域可以不存储任何信息,也可存储如线性表长度等附加信息,头结点的指针域指向第一个结点的指针。
2.头指针和头结点的连续
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。具有标识作用,所以常用头指针来表示链表的名字。无论链表是否为空,头指针均不为空。头指针是链表的必要元素。头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义。有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了。头结点不是链表的必要元素。
3.单链表的基本操作
存储结构的定义和函数的声明
//线性表的单链表存储结构 struct ListNode { int m_nValue; ListNode* m_pNext; }; //创建一个结点 ListNode* CreateListNode(int value); //连接结点 void ConnectListNodes(ListNode* pCurrent, ListNode* pNext); //尾部插入一个结点 void AddToTail(ListNode** pHead,int value); //删除一个结点 void RemoveNode(ListNode** pHead,int value); //打印结点 void PrintListNode(ListNode* pNode); //打印链表 void PrintList(ListNode* pHead); //销毁链表 void DestroyList(ListNode* pHead);
函数的定义
#include<iostream.h> #include<stdlib.h> #include"List.h" //创建一个结点 ListNode* CreateListNode(int value) { ListNode* pNode=new ListNode(); if(pNode==NULL) { cout<<"创建结点失败!"<<endl; return NULL; } pNode->m_nValue=value; pNode->m_pNext=NULL; return pNode; } //连接结点 void ConnectListNodes(ListNode* pCurrent, ListNode* pNext) { if(pCurrent==NULL) { cout<<"当前结点不存在!"<<endl; return; } pCurrent->m_pNext=pNext; } //尾部插入节点 void AddToTail(ListNode** pHead,int value) { if(pHead==NULL) return; ListNode* pNew=new ListNode(); pNew->m_nValue=value; pNew->m_pNext=NULL; if(*pHead==NULL) *pHead=pNew; else { ListNode* pNode=*pHead; while(pNode->m_pNext!=NULL) pNode=pNode->m_pNext; pNode->m_pNext=pNew; } } //删除一个结点 void RemoveNode(ListNode** pHead,int value) { if(pHead==NULL||*pHead==NULL) return; if((*pHead)->m_pNext==NULL&&(*pHead)->m_nValue==value)//一个结点 { delete (*pHead); *pHead=NULL; return; } ListNode* pToBeDeleted; ListNode* pNode=*pHead; while(pNode->m_pNext->m_pNext!=NULL) { if(pNode->m_pNext->m_nValue!=value) pNode=pNode->m_pNext; else { pToBeDeleted=pNode->m_pNext; pNode->m_pNext=pNode->m_pNext->m_pNext; delete pToBeDeleted; pToBeDeleted=NULL; return; } } } //打印结点 void PrintListNode(ListNode* pNode) { if(pNode == NULL) { cout<<"结点为空!"<<endl; } else { cout<<"结点值为:"<< pNode->m_nValue<<endl; } } //打印链表 void PrintList(ListNode* pHead) { cout<<"开始打印链表"<<endl; ListNode* pNode = pHead; while(pNode != NULL) { cout<<pNode->m_nValue<<" "; pNode = pNode->m_pNext; } cout<<"打印链表结束"<<endl; } //销毁链表 void DestroyList(ListNode* pHead) { if(pHead==NULL) return; ListNode* pCur=pHead; while(pCur!=NULL) { pHead=pHead->m_pNext; delete pCur; pCur=pHead; } }
这些代码是我也是参考了很多资料的,如有问题大家可以发评论,我们共同交流。
相关文章推荐
- To_review_100_0---堆的整理
- 数据结构系列之折半查找树
- 数据结构学习笔记之Linklist
- 数据结构基础(1)--数组C语言实现--动态内存分配
- 数据结构和算法-007 队列
- 大话数据结构—散列表查找(哈希表)
- 数据结构表达式求值
- SDUT 2137 数据结构实验之求二叉树后序遍历和层次遍历
- BZOJ 4085:[Sdoi2015]quality(round 2 音质检测)(数据结构)
- MySQL索引背后的数据结构及算法原理
- 数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- leetcode--Binary Tree Inorder Traversal
- Codeforces Round #306 (Div. 2) D.E. 解题报告
- Json数据结构
- XML、JSON数据结构解析
- 大话数据结构—多路查找树(B树)
- RDP协议详解
- 数据结构(二)---栈:
- JAVA数据结构之String、StringBuffer和StringBuilder之间的区别
- 数据结构