链表
含有头结点的链表和不含头结点的链表
有和没有的区别在于,我们申请第一个几点时,是否给数据进行初始化。
//含有头节点 Link* head = new Link; Link* TempLink = head; for(int i = 1; i < 6; ++i){ Link* list = new Link; list->elem = i; list->next = NULL; TempLink->next = list; TempLink = TempList->next; }
//不含头节点 Link* head = new Link; head->elem = 1; head->next = NULL Link* TempLink = head; for(int i = 1; i < 6; ++i){ Link* list = new Link; list->elem = i; list->next = NULL; TempLink->next = list; TempLink = TempList->next; }
以及他们在输出时也会有区别,有头结点的需要先TempLink = TempLink->next;在输出TempLink->elem;(先转到储存数据的节点,再输出)
而没有头结点的链表,可以直接输出,在跳到下一个节点。
void Display(Link* p) { Link* temp; temp = p; while (temp->next != NULL) { temp = temp->next;//先跳到下一个节点 cout << temp->elem << " "; } cout << endl; } void Display(Link* p) { Link* temp; temp = p; while (temp->next != NULL) { cout << temp->elem << " "; temp = temp->next;//后跳到下一个节点 } cout << endl; }
下面都是用没有头结点的链表进行举例
初始化:
- 创建首元节点,进行初始化。
- 给首元节点一个操作指针节点,进行下面的操作。(相当于两个指针,一个记录当前的首元节点,一个进行后面节点的操作)。
- 循环赋值一个新的节点。
- 将操作指针节点指向新节点。
- 将操作指针节点变为新的节点。
- 从步骤3继续执行
插入:
- 检查插入位置//后面操作不再写
- 循环,将操作指针节点成为插入位置的上一个节点
- 创建新节点,初始化插入数据
- 将新节点指针指向操作指针存储的下一个节点地址, 将操作指针节点指针指向新节点。
删除:
- 循环,操作指针节点成为删除位置的上一个节点。
- 将操作指针节点指针指向删除位置指向的节点
- 释放删除位置节点
查找:
- 循环,查看元素是否相等,返回位置。
更改:
- 找到要更改元素
- 赋新值
#include <iostream> using namespace std; struct Link { int elem; struct Link* next; }; Link* InitLink() { Link* p = new Link; Link* temp = p; for (int i = 1; i < 5; ++i) { Link* a = new Link; a->elem = i; a->next = NULL; temp->next = a; temp = temp->next; } return p; } Link* Insert(Link* p, int elem, int pos) { Link* temp = p; for (int i = 1; i < pos; ++i) { if (temp == NULL) { cout << "位置错误" << endl; return p; } temp = temp->next; } Link* a = new Link; a->elem = elem; a->next = temp->next; temp->next = a; return p; } Link* Delete(Link* p, int pos) { Link* temp = p; for (int i = 1; i < pos; ++i) { if (temp == NULL) { cout << "位置有误" << endl; return p; } temp = temp->next; } Link* m = temp->next; temp->next = temp->next->next; delete m; return p; } int Find(Link* p, int elem) { Link* temp = p; int n = 1; while (temp->next) { temp = temp->next; if (temp->elem == elem) break; ++n; } return n; } Link* Alter(Link* p, int elem, int pos) { Link* temp = p; temp = temp->next; for (int i = 1; i < pos; ++i) { temp = temp->next; } temp->elem = elem; return p; } void Display(Link* p) { Link* temp; temp = p; while (temp->next != NULL) { temp = temp->next;//先跳到下一个节点 cout << temp->elem << " "; } cout << endl; } int main() { Link* p = InitLink(); Display(p); p = Insert(p, 9, 5); Display(p); p = Delete(p, 5); Display(p); int n = Find(p, 3); cout << n << endl; p = Alter(p, 10, 2); Display(p); system("PAUSE"); return 0; }