赞
踩
- n个节点离散分配
- 彼此通过指针相连
- 每个节点只有一个前驱节点,每个节点只有一个后续节点
- 首节点没有前驱节点,尾节点没有后续节点
- 首节点:第一个有效节点
- 尾节点:最后一个有效节点
- 头结点:头结点的数据类型和首节点数据类型一样
第一个有效节点之前的那个节点;
头结点并不存放有效数据
加结点的目的主要是为了方便对链表的操作- 头指针:指向头结点的指针变量
- 尾指针:指向尾节点的指针变量
- 只需要一个参数:头指针
- 因为我们通过头指针可以推算出链表的其他所有信息
- 单链表
- 双链表:每一个节点有两个指针域
- 循环链表:能通过任何一个节点找到其他所有的节点
- 非循环链表
- 链表的定义
- 链表的遍历输出
- 判断链表是否为空
- 确定链表的长度
- 对链表进行排序(冒泡排序)
- 在链表的指定位置前插入节点
- 删除指定位置的节点
#include<iostream> using namespace std; struct Node { int data; Node* pNext; }; Node* create_list(void); void traverse_list(Node* pHead); bool judge_empty(Node* pHead); int length_list(Node* pHead); void sort_list(Node* pHead); bool plug_list(Node* pHead, int pos, int val); bool delete_list(Node* pHead, int pos, int* pVal); int main() { Node* pHead; int val; pHead = create_list(); // 功能:创建一个非循环单链表,并将该链表的头节点的地址赋给pHead; traverse_list(pHead); // 遍历 //if (judge_empty(pHead)) //{ // cout << "链表为空!" << endl; //} //else //{ // cout << "链表不为空!" << endl; //} //int len = length_list(pHead); //cout << "链表的长度是:" << len << endl; //sort_list(pHead); //traverse_list(pHead); plug_list(pHead, 4, 33); traverse_list(pHead); if (delete_list(pHead, 4, &val)) { cout << "删除成功,删除的元素是:" << val << endl; } else { cout << "删除失败!" << endl; } traverse_list(pHead); system("pause"); return 0; } Node* create_list(void) { int len; // 用来存放有效节点的个数 int i; int val; // 用来临时存放用户输入的节点的值 Node* pHead = new(Node); if (NULL == pHead) { cout << "分配失败,程序终止!" << endl; exit(-1); } Node* pTail = pHead; pTail->pNext = NULL; cout << "请输入您需要生成的链表节点的个数:len = " << endl; cin >> len; for (i = 0; i < len; i++) { cout << "请输入第" << i + 1 << "个节点的值:" << endl; cin >> val; Node* pNew = new(Node); if (NULL == pNew) { cout << "分配失败,程序终止!" << endl; exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void traverse_list(Node* pHead) { Node* p = pHead->pNext; cout << "遍历的链表内容如下:" << endl; while (p != NULL) { cout << p->data<<"\t"; p = p->pNext; } cout << endl; return; } bool judge_empty(Node* pHead) { if (pHead->pNext == NULL) { return true; } else { return false; } } int length_list(Node* pHead) { Node* p = pHead->pNext; int len = 0; while (NULL != p) { len++; p = p->pNext; } return len; } // 在pHead所指向的链表的第pos个节点的前面插入一个新的节点,该节点的值是val,并且pos的值是从1开始的 bool plug_list(Node* pHead, int pos, int val) { int i = 0; Node* p = pHead; while (NULL != p && i < pos - 1) { p = p->pNext; i++; } if (i > pos - 1 || NULL == p) { return false; } Node* pNew = new(Node); if (NULL == pNew) { cout << "动态内存分配失败!" << endl; exit(-1); } pNew->data = val; Node* q = p->pNext; p->pNext = pNew; pNew->pNext = q; return true; } bool delete_list(Node * pHead, int pos, int * pVal) { int i = 0; Node* p = pHead; while (NULL != p->pNext && i < pos - 1) { p = p->pNext; i++; } if (i > pos - 1 || NULL == p->pNext) { return false; } Node* q = p->pNext; *pVal = q->data; // 删除p节点后面的节点 p->pNext = p->pNext->pNext; delete q; q = NULL; return true; } void sort_list(Node * pHead) { int i, j; int len = length_list(pHead); Node* p; Node* q; // 冒泡排序实现 for (i = 0; i < len - 1; i++) { for (j = 0, q = pHead->pNext; j < len - i - 1; j++,q = q->pNext) { if (q->data > q->pNext->data) { int temp = q->data; q->data = q->pNext->data; q->pNext->data = temp; } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。