C语言单链表的实现

it2023-11-20  63

先创建这三个文件:

其中singleList.h是头文件 Main.cpp是主函数文件 SingList.cpp是函数实现文件

头文件代码:

#pragma once #ifndef _SINGLELIST_H_ #define _SINGLELIST_H_ #include<stdio.h> #include<malloc.h> #include<assert.h> typedef int ElemType; typedef struct Node // 创建结点 { ElemType data; // 数据域 struct Node* next; // 指针域 }Node,*PNode; typedef struct List { PNode first; // 指向头结点作为头指针 PNode last; // 指向最后一个节点 size_t size; // 结点个数 }List; void InitList(List* list); void push_back(List* list,ElemType num); // 尾插 void show_list(List list); // 显示链表 void pushu_front(List* list,ElemType num); // 头插 void pop_back(List* list); // 尾部删除 void pop_front(List* list);// 头删 void sort(List* list);// 排序 void insert_val(List* list,ElemType num); // // 按值插入(前提是已经排好顺序的链表) void length(List* list); // 链表长度 void reserve(List* list); // 逆置 int find(List* list,ElemType num); // 查找 void clear(List* list); // 清空链表 void delect_val(List* list,ElemType num); // 删除某个结点 #endif // !_SINGLELIST_H_

主函数文件代码:

#include"singleList.h" int main() { int select; ElemType num; List mylist; // 创建一个链表 InitList(&mylist); while (true) { printf("*******************************************************************\n"); printf("*****[1]push_back [2]pushu_front*\n"); printf("*****[3]show_list [4]pop_back *\n"); printf("*****[5]pop_front [6]insert_val *\n"); printf("*****[7]length [8]reverse *\n"); printf("*****[9]sort [10]find *\n"); printf("*****[11]clear [12]delect_val*\n"); printf("*****[0]auit_system *\n"); printf("*******************************************************************\n"); printf("请选择>:"); scanf_s("%d",&select); getchar(); if (select == 0) { printf("已退出!\n"); getchar(); break; } switch (select) { case 1: printf("请输入要插入的值(-1作为结束):"); while (scanf_s("%d",&num),num != -1) { push_back(&mylist,num); } break; case 2: printf("请输入要插入的值(-1作为结束):"); while (scanf_s("%d", &num), num != -1) { pushu_front(&mylist,num); } break; case 3: show_list(mylist); break; case 4: pop_back(&mylist); break; case 5: pop_front(&mylist); break; case 6: printf("请输入你要插入的值:"); scanf_s("%d",&num); insert_val(&mylist,num); break; case 7: length(&mylist); break; case 8: reserve(&mylist); break; case 9: sort(&mylist); break; case 10: printf("请输入要查找的元素:"); scanf_s("%d",&num); int count; count = find(&mylist, num); printf("%d出现的次数为(若不存在为-1):%d\n",num,count); break; case 11: clear(&mylist); break; case 12: printf("请输入要删除的元素:"); scanf_s("%d",&num); delect_val(&mylist,num); break; default: printf("输入错误,重新选择!"); break; } } return 0; }

函数实现部分的代码:

#include"singleList.h" // 初始化 void InitList(List* list) { list->first = list->last = (Node*)malloc(sizeof(Node)); assert(list->first != NULL); list->first->next = NULL; // 将头结点指向的下一个结点赋值为空 list->size = 0; } // 尾部插入:对于单链表,在尾部插入时我们要从开头开始,找到最后一个结点,然后最后一个节点的后面插入 void push_back(List* list,ElemType num) { Node* s = (Node*)malloc(sizeof(Node)); assert(s != NULL); Node* p = list->first; while (p->next != NULL) { p = p->next; } s->data = num; list->last->next = s; list->last = s; s->next = NULL; list->size++; } // 显示链表 void show_list(List list) { if (list.size == 0) { printf("链表为空!!\n"); return; } Node* p = list.first->next; while (p != NULL) { printf("%d->",p->data); p = p->next; } printf("\n"); } // 头插法 void pushu_front(List* list,ElemType num) { Node* s = (Node*)malloc(sizeof(Node)); assert(s != NULL); s->data = num; if (list->size == 0) { list->first->next = s; list->last = s; s->next = NULL; list->size++; return; } s->next = list->first->next; list->first->next = s; list->size++; } // 尾删 void pop_back(List* list) { if (list->size == 0) { printf("链表个数为0无法删除!"); return; } Node* p = list->first; while (p->next != list->last)//找到最后一个元素的前驱 { p = p->next; } list->last = p; free(p->next); list->last->next = NULL; list->size --; } // 头删 void pop_front(List* list) { if (list->size == 0) { printf("链表个数为0无法删除!"); return; } Node* s = list->first->next; list->first->next = s->next; free(s); list->size--; } // 排序:先将链表不包含头节点的第二个结点与第一个结点断开成两条链表,然后第二个(包括)以后的结点按值从小到大插入到第一条链表 void sort(List* list) { if (list->size < 2) { printf("链表个数为小于2个,无法排序!"); return; } Node* s = list->first->next; Node* p = s->next; list->last = s; // 让last指向头节点的后一个结点 list->last->next = NULL; // 让last的后一个结点为空 while (p != NULL) { s = p; p = p->next; Node* q = list->first; while (q->next && q->next->data < s->data) // 改变q的指向 { q = q->next; } if (q == list->last) // 如果q为最后一个结点,那么要改变最后list->last的指向 { list->last = s; } s->next = q->next; q->next = s; } } // // 按值插入(前提是已经排好顺序的链表) void insert_val(List* list,ElemType num) { Node* p = list->first; while (p->next && p->next->data < num) { p = p->next; } Node* s = (Node*)malloc(sizeof(Node)); assert(s != NULL); s->data = num; s->next = p->next; p->next = s; } // 链表长度 void length(List* list) { printf("链表长度为:%d\n",list->size); } // 逆置(将第一个结点与第二个结点之间断开,第二个节点之后的结点依次头插) void reserve(List* list) { Node* s = list->first->next; Node* p = s->next; list->last = s; list->last->next = NULL; //这就实现了断开 while (p) { s = p; p = p->next; s->next = list->first->next; list->first->next = s; } } // 查找,如果不存在,返回-1 int find(List* list, ElemType num) { Node* p = list->first; int count = 0; while (p->next) { if (p->next->data == num) { count++; } p = p->next; } if (count == 0) { return -1; } else { return count; } } // 清空链表(头节点之后的结点都释放掉) void clear(List* list) { Node* p = list->first->next; list->last = list->first; list->first->next = NULL; Node* s = p->next; while (s) { free(p); p = s; s = s->next; } list->size = 0; } // 删除 void delect_val(List* list, ElemType num) { Node* p = list->first; Node* s = p->next; while (s) { if (s->data == num) { p->next = s->next; free(s); list->size--; } p = p->next; s = p->next; } }

路过的大神多指教,正在学数据结构

最新回复(0)