定义链表结构,定义构造函数,链表内next为空时,表示为最后一个数据。
#include <iostream> using namespace std; /// <summary> /// 链表结构 /// </summary> struct ListNode { int value; ListNode* next; //构造函数 ListNode(int v, ListNode* n = NULL) { value = v; next = n; } };
输出链表数据,链表指针后移,直到链表指针为NULL
/// <summary> /// 输出链表数据 /// </summary> /// <param name="ln"></param> void Print(ListNode* ln) { while (ln != NULL) { cout << ln->value << endl; ln = ln->next; } }
获取链表长度
/// <summary> /// 获取单链表长度 /// </summary> /// <returns></returns> int GetLength(ListNode* head) { int count = 0; while (head!=NULL) { count++; head = head->next; } return count; }
判断单链表是否为空
/// <summary> /// 判断单链表是否为空 /// </summary> /// <param name="head"></param> /// <returns></returns> bool IsEmpty(ListNode* head) { if (head->next==NULL) { return true; } return false; }
查找节点
/// <summary> /// 查找节点 /// </summary> /// <param name="head"></param> /// <param name="data"></param> /// <returns></returns> ListNode* Find(ListNode* head, int data) { if (head == NULL) { return NULL; } else { while (head!=NULL) { if (head->value==data) { return head; } head = head->next; } return NULL; } }
/// <summary> /// 插入节点,判断原链表是否是空链表,如果是,将head指向新增节点 /// 如果不是空链表,向链尾插入新节点 /// </summary> /// <param name="head"></param> /// <param name="data"></param> /// <returns></returns> void InsertNode(struct ListNode* head, ListNode* newNode) { ListNode* p = head; if (p==NULL) { p = newNode; } else { while (p->next!=NULL) { p = p->next; } p->next = newNode; } }
/// <summary> /// 在制定位置插入数据 /// </summary> /// <param name="head"></param> /// <param name="newNode"></param> /// <param name="num"></param> void InsertNode(ListNode* head, ListNode* newNode, int num) { if (num==0) { int i = head->value; head->value = newNode->value; newNode->value = i; ListNode* walk = head->next; head->next = newNode; newNode->next = walk; } else if (num<=GetLength(head)) { ListNode* p = head; int i = 1; while (num>i) { p = p->next; i++; } newNode->next = p->next; p->next = newNode; } else { cout << "索引超出!!!" << endl; } }
/// <summary> /// 在尾部删除元素 /// </summary> /// <param name="head"></param> void Delete(ListNode* head) { ListNode* p = head; ListNode* temp = NULL; if (head==NULL||head->next==NULL) { return; } else { while (p->next!=NULL) { temp = p; p = p->next; } delete p; p = NULL; temp->next = NULL; } }
/// <summary> /// 删除所有元素 /// </summary> /// <param name="head"></param> void DeleteAll(ListNode* head) { ListNode* p = head->next; ListNode* temp = NULL; while (p!=NULL) { temp = p; p = p->next; temp->next = NULL; delete temp; } head->next = NULL; head->value = NULL; }
/// <summary> /// 线性表排序,冒泡排序,直接遍历链表 /// </summary> /// <param name="head"></param> void ListSort(ListNode* head) { ListNode* first = head; int num = GetLength(head); for (int i = 0; i < num-1; i++) { for (int j = 0; j < num-i-1; j++) { if (first->value > first->next->value) { int temp = first->value; first->value = first->next->value; first->next->value = temp; } first = first->next; } first = head; } }
int main() { ListNode* three = new ListNode(3); ListNode* second = new ListNode(1, three); ListNode* head = new ListNode(2, second); ListNode* four = new ListNode(10); InsertNode(head, four,0); Delete(head); Print(head); cout << "排序" << endl; ListSort(head); Print(head); return 0; }