链表基础
- 基本的单链表创建与遍历
#include <iostream> #include <stdlib.h> using namespace std; struct LinkNode { LinkNode* next; int data; }; typedef LinkNode LinkList; LinkList* CreateList() { LinkList* list = NULL; LinkNode* p = list; LinkNode* s; int data; while (true) { cin >> data; if (data == 0) break; s = (LinkList*)malloc(sizeof(LinkList)); s->data = data; s->next = NULL; if (list == NULL) { list = s; p = s; }else{ p->next = s; } p = s; } cout << "Created List" << endl; return list; } void LoopList(LinkList* list) { if (list == NULL) { cout << "Empty list" << endl; return; } LinkNode* p = list; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } int main() { LinkList* list = CreateList(); LoopList(list); system("pause"); return 0; }
- 单链表创建时排序
#include <iostream> #include <stdlib.h> using namespace std; struct LinkNode { LinkNode* next; int data; }; typedef LinkNode LinkList; LinkList* CreateSortedList() { LinkList* list = NULL; LinkNode* p; LinkNode* prev_p; LinkNode* s; int data; while (true) { cin >> data; if (data == 0) break; s = (LinkList*)malloc(sizeof(LinkList)); s->data = data; s->next = NULL; if (list == NULL) { list = s; } else{ p = list; prev_p = NULL;//由于单链表无法直接定位到上一个结点,所以保存上一个结点的临时指针 while (p != NULL) { if (p->data > s->data) { if (prev_p == NULL)//需要插入到第一个结点之前的情况,需要移动头指针list的位置 { s->next = p; list = s; } else { s->next = p; prev_p->next = s; } break; } else if (p->next = NULL)//已到链表尾部的情况 { p->next = s; break; } else{//当前不符合插入条件,继续往下一个结点移动 prev_p = p; p = p->next; } } } } cout << "Created Sorted List" << endl; return list; } void LoopList(LinkList* list) { if (list == NULL) { cout << "Empty list" << endl; return; } LinkNode* p = list; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } int main() { LinkList* list = CreateSortedList(); LoopList(list); system("pause"); return 0; }
- 单链表倒置
#include <iostream> #include <stdlib.h> using namespace std; struct LinkNode { LinkNode* next; int data; }; typedef LinkNode LinkList; LinkList* CreateList() { LinkList* list = NULL; LinkNode* p = list; LinkNode* s; int data; while (true) { cin >> data; if (data == 0) break; s = (LinkList*)malloc(sizeof(LinkList)); s->data = data; s->next = NULL; if (list == NULL) { list = s; p = s; }else{ p->next = s; } p = s; } cout << "Created List" << endl; return list; } void LoopList(LinkList* list) { if (list == NULL) { cout << "Empty list" << endl; return; } LinkNode* p = list; while (p != NULL) { cout << p->data << " "; p = p->next; } cout << endl; } LinkList* Reverse(LinkList* list) { if (list == NULL) { cout << "Empty list" << endl; return NULL; } LinkNode* p = list; LinkNode* rear = NULL; LinkNode* temp; while (p != NULL) { temp = p; p = p->next; temp->next = rear; rear = temp; } return rear; } int main() { LinkList* list = CreateList(); LinkList* revList = Reverse(list); LoopList(revList); system("pause"); return 0; }