单链表的创建
单链表的创建
1.单链表的定义
1 2 3 4 5 6 7 8 9 10 11 | typedef struct listNode //定义链表结构体 { int data; struct listNode* next; int length; }listNode , *LinkList; void init(LinkList& l) //初始化链表 { l = (LinkList) malloc ( sizeof (listNode*)); l->next = nullptr ; } |
2.头插法构建单链表
1 2 3 4 5 6 7 8 9 | void create_LinkList_head(LinkList& l, const int x) //头插法创建链表 { listNode* new_node; new_node = (listNode*) malloc ( sizeof (listNode)); new_node->next = l->next; l->next = new_node; new_node->data = x; l->length++; } |
3.尾插法构建单链表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void create_LinkList_tail(LinkList& l, const int x) //尾插法创建链表 { listNode* new_node; listNode* tail_node; new_node = (listNode*) malloc ( sizeof (listNode)); tail_node = l; while (tail_node->next) { tail_node = tail_node->next; } new_node->data = x; new_node->next = nullptr ; tail_node->next = new_node; l->length++; } |
4.在指定位置插入元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void insert_x_pos(LinkList& l, const int x, int pos) //在链表的指定位置插入元素 { listNode* now_node; listNode* new_node; new_node = (listNode*) malloc ( sizeof (listNode)); new_node->data = x; now_node = l; while (pos-- > 1) { now_node = now_node->next; } new_node->next = now_node->next; now_node->next = new_node; l->length++; } |
5.删除某个位置的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | int delete_pos(LinkList& l, const int pos) //删除某个位置的元素 { listNode* tem_node; listNode* del_node; tem_node = l; int elem; for ( int x = 1; x < pos; x++) { tem_node = tem_node->next; } elem = tem_node->next->data; del_node = tem_node->next; tem_node->next = tem_node->next->next; free (del_node); l->length--; return elem; } |
6.更改某个位置的元素
1 2 3 4 5 6 7 8 9 10 | void update_x_pos(LinkList& l, const int x, const int pos) //改变某个位置的元素 { listNode* tem_node; tem_node = l; for ( int i = 1; i < pos; i++) { tem_node = tem_node->next; } tem_node->next->data = x; } |
7.查找某个位置的元素
1 2 3 4 5 6 7 8 9 10 | int find_pos(LinkList& l, const int pos) //查找某个位置的元素 { listNode* tem_node; tem_node = l; for ( int i = 1; i < pos; i++) { tem_node = tem_node->next; } return tem_node->next->data; } |
8.打印链表
1 2 3 4 5 6 7 8 9 10 11 | void print_LinkList(LinkList& l) //打印链表 { listNode* now_node; now_node = l; while (now_node->next) { std::cout<<now_node->next->data<< " " ; now_node = now_node->next; } std::cout<<std::endl; } |
9.获取链表的长度
1 2 3 4 | int get_lenght( const LinkList&l) { return l->length; } |
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | //list_with_pointer.h #ifndef _LIST_WITH_POINTER_ #define _LIST_WITH_POINTER_ #include<malloc.h> typedef struct listNode //定义链表结构体 { int data; struct listNode* next; int length; }listNode , *LinkList; void init(LinkList& l) //初始化链表 { l = (LinkList) malloc ( sizeof (listNode*)); l->next = nullptr ; } void create_LinkList_head(LinkList& l, const int x) //头插法创建链表 { listNode* new_node; new_node = (listNode*) malloc ( sizeof (listNode)); new_node->next = l->next; l->next = new_node; new_node->data = x; l->length++; } void create_LinkList_tail(LinkList& l, const int x) //尾插法创建链表 { listNode* new_node; listNode* tail_node; new_node = (listNode*) malloc ( sizeof (listNode)); tail_node = l; while (tail_node->next) { tail_node = tail_node->next; } new_node->data = x; new_node->next = nullptr ; tail_node->next = new_node; l->length++; } void insert_x_pos(LinkList& l, const int x, int pos) //在链表的指定位置插入元素 { listNode* now_node; listNode* new_node; new_node = (listNode*) malloc ( sizeof (listNode)); new_node->data = x; now_node = l; while (pos-- > 1) { now_node = now_node->next; } new_node->next = now_node->next; now_node->next = new_node; l->length++; } int delete_pos(LinkList& l, const int pos) //删除某个位置的元素 { listNode* tem_node; listNode* del_node; tem_node = l; int elem; for ( int x = 1; x < pos; x++) { tem_node = tem_node->next; } elem = tem_node->next->data; del_node = tem_node->next; tem_node->next = tem_node->next->next; free (del_node); l->length--; return elem; } void update_x_pos(LinkList& l, const int x, const int pos) //改变某个位置的元素 { listNode* tem_node; tem_node = l; for ( int i = 1; i < pos; i++) { tem_node = tem_node->next; } tem_node->next->data = x; } int find_pos(LinkList& l, const int pos) //查找某个位置的元素 { listNode* tem_node; tem_node = l; for ( int i = 1; i < pos; i++) { tem_node = tem_node->next; } return tem_node->next->data; } void print_LinkList(LinkList& l) //打印链表 { listNode* now_node; now_node = l; while (now_node->next) { std::cout<<now_node->next->data<< " " ; now_node = now_node->next; } std::cout<<std::endl; } int get_lenght( const LinkList&l) { return l->length; } #endif |
//list_with_pointer.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <em id= "__mceDel" >#include<iostream> #include"list_with_pointer.h" using namespace std; void test(LinkList& l) { init(l); int x; cout<< "请输入你想插入的元素(int):" ; cin>>x; while (x != -1) { create_LinkList_head(l, x); //头插法创建 //create_LinkList_tail(l, x)尾插法创建 cout<< "请输入你想插入的元素(int):" ; cin>>x; } cout<< "链表中的元素:" ; print_LinkList(l); int insert_x, insert_pos; cout<< "请输你想插入的元素(int)和位置([1,l.length+1])" ; cin>>insert_x>>insert_pos; insert_x_pos(l, insert_x, insert_pos); cout<< "在第" <<insert_pos<< "个位置插入" <<insert_x<< "后链表中的元素:" ; print_LinkList(l); int delete_x, pos; cout<< "你想删除第几个位置([1,l.length]):" ; cin>>pos; delete_x = delete_pos(l, pos); cout<< "删除该位置的元素后,链表中的元素:" ; print_LinkList(l); int updata_x, updata_pos; cout<< "请输入想更新的元素(int)和它所在的位置([1,l.length]):" ; cin>>updata_x>>updata_pos; update_x_pos(l, updata_x, updata_pos); cout<< "更新后链表中的元素:" ; print_LinkList(l); int pos_find; cout<< "你想查找第几个元素([1,l.lenght]):" ; cin>>pos_find; cout<< "该位置的元素为:" <<find_pos(l, pos_find)<<endl; } int main() { LinkList l;<br> test(l); return 0; } </em> |
void create_LinkList_tail(LinkList& l, const int x)//尾插法创建链表
{
listNode* new_node;
listNode* tail_node;
new_node = (listNode*)malloc(sizeof(listNode));
tail_node = l;
while (tail_node->next)
{
tail_node = tail_node->next;
}
new_node->data = x;
new_node->next = nullptr;
tail_node->next = new_node;
l->length++;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异