线性表-链表的操作实现

LinkList.h

#ifndef __LINKLIST__H__ #define __LINKLIST__H__ #include <stdio.h> #include <stdlib.h> typedef struct LinkNode { int data; struct LinkNode* next; }LinkNode; typedef struct LinkList { LinkNode* head; }LinkList; // // 遍历链表 void LinkListPrint(LinkList* list); // 初始化链表 LinkList* LinkListInit(void); // 创建结点 LinkNode* CreateNode(int data); // 头插结点 void LinkListPushFront(LinkList* list, int data); // 尾插结点 void LinkListPushBack(LinkList* list, int data); // 任意位置插结点 void LinkListPushPos(LinkList* list, int pos, int data); // 头删结点 void LinkListPopFront(LinkList* list); // 尾删结点 void LinkListPopBack(LinkList* list); // 任意位置删结点 void LinkListPopPos(LinkList* list, int pos); // 按照值删除 void LinkListPopVal(LinkList* list, int val); // 按照值修改 void LinkListModifyVal(LinkList* list, int oldVal, int newVal); // 按照位置修改 void LinkListModifyPos(LinkList* list, int pos, int newVal); // 按照位置查找 void LinkListSeekPos(LinkList* list, int pos); // 按值查找 void LinkListSeekVal(LinkList* list, int val); // 清空链表 void LinkListClear(LinkList* list); //链表销毁 void LinkListDesdroy(LinkList** list); #endif

LinkList.c

#include "LinkList.h" // 遍历链表 void LinkListPrint(LinkList* list) { LinkNode* cur = list->head; while(cur != NULL) { printf("%d->", cur->data); cur = cur->next; } putchar('\n'); } // 初始化链表 LinkList* LinkListInit() { LinkList* list = (LinkList*)malloc(sizeof(LinkList)); if(NULL == list) { printf("malloc fail!\n"); exit(-1); } list->head = NULL; return list; } // 创建结点 LinkNode* CreateNode(int data) { LinkNode* newNode = (LinkNode*)malloc(sizeof(LinkNode)); newNode->data = data; newNode->next = NULL; return newNode; } // 头插结点 void LinkListPushFront(LinkList* list, int data) { LinkNode* newNode = CreateNode(data); newNode->next = list->head; list->head = newNode; } // 尾插结点 void LinkListPushBack(LinkList* list, int data) { LinkNode* newNode = CreateNode(data); LinkNode* cur = list->head; // LinkNode* temp = NULL; while(cur->next != NULL) { // temp = cur; cur = cur->next; } cur->next = newNode; } // 任意位置插结点 void LinkListPushPos(LinkList* list, int pos, int data) { if(pos < 0 || list->head == NULL) { printf("无效位置插入!\n"); return; } if(0 == pos) { LinkListPushFront(list, data); return; } LinkNode* newNode = CreateNode(data); LinkNode* cur = list->head; while(--pos) { cur = cur->next; } newNode->next = cur->next; cur->next = newNode; } // 头删结点 void LinkListPopFront(LinkList* list) { if(list->head == NULL) { printf("空链表!\n"); return; } LinkNode* cur = list->head; list->head = list->head->next; free(cur); } // 尾删结点 void LinkListPopBack(LinkList* list) { if(list->head == NULL) { printf("空链表!\n"); return; } LinkNode* cur = list->head; LinkNode* temp = NULL; while(cur->next != NULL) { temp = cur; cur = cur->next; } temp->next = NULL; free(cur); } // 任意位置删结点 void LinkListPopPos(LinkList* list, int pos) { if(pos < 0 || list->head == NULL) { printf("无效位置删除结点!\n"); return; } if(0 == pos) { LinkListPopFront(list); return; } LinkNode* cur = list->head; LinkNode* temp = NULL; while(--pos) { cur = cur->next; } temp = cur->next; cur->next = cur->next->next; free(temp); } // 按照值删除 void LinkListPopVal(LinkList* list, int val) { if(NULL == list->head) { printf("空链表!\n"); return; } if(list->head->data == val) { LinkListPopFront(list); return; } LinkNode* cur = list->head; LinkNode* temp = NULL; while(cur->data != val) { temp = cur; cur = cur->next; } temp->next = cur->next; free(cur); } //按照值修改 void LinkListModifyVal(LinkList* list, int oldVal, int newVal) { if(NULL == list->head) { printf("空链表!\n"); return; } LinkNode* cur = list->head; while(cur) { if(cur->data == oldVal) { cur->data = newVal; return; } cur = cur->next; } printf("链表中没有值为%d的结点\n", oldVal); } // 按照位置修改 void LinkListModifyPos(LinkList* list, int pos, int newVal) { if(pos < 0 || list->head == NULL) { printf("无效位置修改!\n"); return; } LinkNode* cur = list->head; while(pos--) { cur = cur->next; } cur->data = newVal; } //按照位置查找 void LinkListSeekPos(LinkList* list, int pos) { int temp = pos; if(pos < 0 || list->head == NULL) { printf("无效位置查找!\n"); return; } LinkNode* cur = list->head; while(temp--) { cur = cur->next; } printf("%d位置的值是%d\n", pos, cur->data); } //按值查找 void LinkListSeekVal(LinkList* list, int val) { LinkNode* cur = list->head; int pos = 0; while(cur) { if(cur->data == val) { printf("找到了值为%d的位置%d\n", cur->data, pos); return; } cur = cur->next; ++pos; } printf("没有值为%d的结点\n", val); } // 清空链表 void LinkListClear(LinkList* list) { if(NULL == list) return; LinkNode* cur = list->head; LinkNode* temp = NULL; while(cur) { temp = cur; cur = cur->next; free(temp); } list->head = NULL; printf("清空链表完成!\n"); } //链表销毁 void LinkListDesdroy(LinkList** list) { LinkListClear(*list); free(*list); *list = NULL; printf("链表销毁完成!\n"); }

main.c

#include "LinkList.h" void LinkListTest(void) { // 初始化链表 LinkList* list = LinkListInit(); // 头插结点 printf("头插结点\n"); LinkListPushFront(list, 100); LinkListPushFront(list, 200); LinkListPushFront(list, 300); LinkListPrint(list); // 尾插结点 printf("尾插结点\n"); LinkListPushBack(list, 400); LinkListPushBack(list, 500); LinkListPushBack(list, 600); LinkListPrint(list); // 任意位置插结点 printf("任意位置插结点\n"); LinkListPushPos(list, 0, 700); LinkListPrint(list); LinkListPushPos(list, 3, 800); LinkListPrint(list); LinkListPushPos(list, 8, 900); LinkListPrint(list); // 头删结点 printf("头删结点\n"); LinkListPopFront(list); LinkListPrint(list); // 尾删结点 printf("尾删结点\n"); LinkListPopBack(list); LinkListPrint(list); // 任意位置删结点 printf("任意位置删结点\n"); LinkListPopPos(list, 2); LinkListPrint(list); // 按照值删除 printf("按照值删除\n"); LinkListPopVal(list, 200); LinkListPrint(list); //按照值修改 printf("按照值修改\n"); LinkListModifyVal(list, 300, 800); LinkListPrint(list); // 按照位置修改 printf("按照位置修改\n"); LinkListModifyPos(list, 2, 222); LinkListPrint(list); // 按照位置查找 printf("按照位置查找\n"); LinkListSeekPos(list, 0); // 按值查找 printf("按值查找\n"); LinkListSeekVal(list, 222); // 清空链表 LinkListClear(list); //链表销毁 LinkListDesdroy(&list); } int main(void) { LinkListTest(); return 0; }

__EOF__

本文作者若达萨罗
本文链接https://www.cnblogs.com/bcc0729/p/17621095.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   若达萨罗  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示