单链表的建立、排序和翻转
链表:
1、注意是否有带头结点。
2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。
3、单链表的插入、删除操作需要寻找前驱结点。
单链表的建立、排序和翻转,都是针对有头结点的单链表。
#include <iostream> using namespace std; typedef struct Node { int data; Node * next; }Node,*List; //顺序建表:尾插法 void CreateLinkList(List& L, int n) { // 建立空表 L = (List)malloc(sizeof(Node)); L->next = NULL; //空表 List p = L; //用p指向表尾 // 插入元素 for(int i=0; i<n; i++ ) { int x; cin>>x; List s = (List) malloc(sizeof(Node)); s->data = x; // 插入表尾 s->next = p->next; p->next = s; p = s; // 新的表尾 } } //逆序建表:头插法 void CreateLinkList2(List& L, int n) { // 建立空表 L = (List) malloc(sizeof(Node)); L->next = NULL; // 空表 // 插入元素 for (int i=0; i<n; i++ ) { int x; cin>>x; List s = (List) malloc(sizeof(Node)); s->data = x; // 插入表头 s->next = L->next; L->next = s; } } void PrintLinkList(List L) { List p = L->next; while( p!=NULL ) { cout<<p->data<<" "; p = p->next; } cout<<endl; } int GetLength(Node *head) { int len = 0; List p = head->next; while(p) { ++len; p = p->next; } return len; } void DestroyList(List & L) { List p = L; List q = NULL; while(p) { q = p->next; free(p); p = q; } } //采用插入法将单链表中的元素排序。 void InsertionSort(List & L) { List h=L->next; // 原链表 L->next=NULL; // 新空表 List s=NULL,p=NULL; while(h) { // 从原链表中取下结点s s=h; h=h->next; // 在新表中查找插入位置 p=L; while (p->next && p->next->data<=s->data) p=p->next; // 在p之后插入s s->next=p->next; p->next=s; } } //采用选择法将单链表中的元素排序。 void SelectionSort(List & L) { List p=L; List q=NULL,s=NULL,m=NULL; while (p->next) { // 选择最小(从p->next至表尾) q=p; // 最小元素的前驱q s=p; while(s->next) { if(s->next->data<q->next->data) q=s; s=s->next; } m=q->next; // 找到最小m // 最小元素m插入有序序列末尾(p之后) if (q!=p) { q->next=m->next; // 解下最小m m->next=p->next; // 插入p之后 p->next=m; } p=p->next; // L->next至p为有序序列 } } //单链表就地逆置 void ReverseList(Node* h) { Node* p = h->next; // 原链表 h->next = NULL; // 新表(空表) while(p != NULL) { Node* q = p->next; // 保存下个结点q p->next = h->next; h->next = p; p = q; } } int main() { List head = NULL; CreateLinkList(head,5); PrintLinkList(head); cout<<"Len: "<<GetLength(head)<<endl; InsertionSort(head); PrintLinkList(head); ReverseList(head); PrintLinkList(head); DestroyList(head); return 0; }
作者:阿凡卢
出处:https://www.cnblogs.com/luxiaoxun/archive/2012/08/03/2622323.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App