c语言单链表的基本操作
2017-10-28 11:39
459 查看
链表
是一种动态存储方式,和顺序表相比,链表物理存储上是非连续的,而且采用动态内存开辟,其优点是方便插入,没有上限的存储,不需要内存空间的重组,能有效的分配和利用内存资源,不会造成空间浪费,缺点是排序很麻烦,查找也很麻烦,而且需要多个指针操作,容易出错。链表的各类操作包括:链表的创建、删除、插入、输出、排序等。
结构体定义
要想学懂链表,必须先学好并灵活运用结构,在链表中,一个个独立的结点就是一个结构体元素,一个结点包括两部分(数据域和指针域),靠指针将他们链接在一起。typedf struct Node { DataType _date; struct Node *_next; //存放下一个节点的地址 }Node,*pNode;
链表
创建链表三个重要属性:头指针、头结点、尾结点。头指针(pHead):指向链表头部的指针,也可以看作是 一个特殊的结点,有指针域和数据域,虽然有数据域但不储存任何数据,也没有任何作用,指针域指向第一个结点数据域;
头结点(pNode):链表的第一个结构体元素,其指针域存放第2个节点的地址;
尾结点(TailNode):链表最后一个结构体元素,数据域存放数据域,指针域一般指向空(NULL)。
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<malloc.h> #include<stdio.h> #include<Windows.h> typedef int DataType; typedef struct Node { DataType _data; struct Node * _pNext; }*pNode; //初始化链表 void InitList(pNode* pHead) { assert(pHead); *pHead = NULL; } //创建一个新链表节点 pNode BuyNode(DataType data) { pNode pNewNode = (pNode)malloc(sizeof(struct Node)); if(NULL == pNewNode) { assert(0); return NULL; } pNewNode->_data = data; pNewNode->_pNext = NULL; return pNewNode; } //尾插 void PushBack(pNode* pHead,DataType _data) { assert(pHead); if(NULL == *pHead) { *pHead = BuyNode(_data); } else { pNode pTailNode = *pHead; while(pTailNode->_pNext) { pTailNode = pTailNode->_pNext; } pTailNode->_pNext = BuyNode(_data); } } //尾删 void PopBack(pNode* pHead) { if(NULL == *pHead) return; else if(NULL == (*pHead)->_pNext) { free(*pHead); *pHead = NULL; } else { pNode pTailNode = *pHead; pNode pPre = NULL; while(pTailNode->_pNext) { pPre = pTailNode; pTailNode = pTailNode->_pNext; } pPre->_pNext = NULL; free(pTailNode); } } //打印链表 void PrintList(pNode pHead) { pNode pCur = pHead; while(pCur) { printf("%d--->",pCur->_data); pCur = pCur->_pNext; } printf("NULL\n"); } //头插 void PoshFront(pNode* pHead,DataType data) { pNode pNewNode; assert(pHead); pNewNode = BuyNode(data); if(NULL == pNewNode) return; pNewNode->_pNext = *pHead; *pHead = pNewNode; } //头删 void PopFront(pNode* pHead) { pNode pCur = *pHead; assert(pHead); if(NULL == pCur) return; else { *pHead = (*pHead)->_pNext; free(pCur); } } // 返回结点在链表中的位置 pNode FindList(pNode pHead,DataType data) { pNode pCur = pHead; while(pCur) { if(pCur->_data == data) return pCur; else pCur = pCur->_pNext; } return NULL; } // 任意位置插入值为data的结点 pNode Insert(pNode pos,DataType data) { pNode pNewNode; if(NULL == pos) return NULL; pNewNode = BuyNode(data); if(NULL == pNewNode) //return NULL; pNewNode->_pNext = pos->_pNext; pos->_pNext = pNewNode; } // 删除pos位置上的结点 void Erase(pNode* pHead,pNode pos) { assert(pHead); if(NULL == *pHead || NULL == pos) return; if(*pHead == pos) PopFront(pHead); else { pNode pCur = *pHead; while(pCur) { if(pCur->_pNext == pos) break; pCur = pCur->_pNext; } pCur->_pNext = pos->_pNext; free(pos); } } // 销毁单链表 void DestoryList(pNode* pHead) { //正向销毁 pNode pCur = *pHead; pNode pNext = NULL; while(pCur) { pNext = pCur->_pNext; free(pCur); pCur = pNext; } *pHead = NULL; } // 求链表中节点的个数 int SizeList(pNode pHead) { int count = 1; pNode pCur = pHead; while(pCur) { count++; pCur = pCur->_pNext; } return count; }
相关文章推荐
- 链表的基本操作[C语言]
- C语言实现链表基本操作
- 单链表基本操作示例1[C语言实现]
- C语言链表常见基本操作
- 双向循环链表基本操作(C语言)
- C语言链表基本操作
- 数据结构--单链表的基本操作(C语言实现)
- C语言数据结构 双向链表的建立与基本操作
- c语言实现单链表数据结构及其基本操作
- 双向循环链表基本操作的实现(C语言)
- c语言实现链表及其基本操作
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- 单链表基本操作C语言实现
- C语言实现单链表(带头结点)的基本操作
- C语言实现,无头结点不带环的单向链表的基本操作
- 第一篇博客—c语言单链表的基本操作
- C语言单链表的基本操作(带表头结点)
- 单向链表的C语言实现与基本操作
- c语言链表基本操作(带有创建链表 删除 打印 插入)
- C语言(数据结构) - 双向链表的基本操作