<3> 单链表的各种操作(创建、增加、删除、修改、查找、逆序、判空、置空等)
2017-09-30 14:46
771 查看
1 . 链表的创建
1)首先声明三个结构体指针变量(head、p1、p2),其中,一个是头结点,剩余的两个用来连接。
2)给p1开辟内存空间,代表第一个结点的地址,并且给第一个结点的数据域中的数据赋值。
3)循环创建(假设有N个结点需要创建)的过程。需要分情况,当我们的头结点并没有被连接到任何创建的结点上时,需要将head连接到,同时需要将p2也指向p1,这是因为当我们在将head连接上之后,之后的连接就需要p2和p1来进行完成,不需要head了。如下图:
这是在循环创建时的几个过程。记得每开辟一个空间,需要给结构体中的数据赋值,即每一个结点赋值。
4)创建结束后,需要将p2的指针域指向NULL,代表整个链表结束,并且记得释放p1,因为p1的作用仅仅是为我们创建新的结点。
2 . 判空
链表的最后一个指针域是指向NULL的,所以我们只需要判断head是不是指向NULL即可,如果是,代表链表是空的,如果不是,代表链表有数据。
3 . 置空
同样,我们需要将头指针指向NULL即可。
4 . 删除
如图想要把中间的结点删除,需要将第一个结点的指针域指向第三个结点的地址,就可以实现在链表中将第二个结点删除。
5 . 增加、修改、逆序等见代码的详解。
6 . 详细代码
1)Head.h文件
1)首先声明三个结构体指针变量(head、p1、p2),其中,一个是头结点,剩余的两个用来连接。
2)给p1开辟内存空间,代表第一个结点的地址,并且给第一个结点的数据域中的数据赋值。
3)循环创建(假设有N个结点需要创建)的过程。需要分情况,当我们的头结点并没有被连接到任何创建的结点上时,需要将head连接到,同时需要将p2也指向p1,这是因为当我们在将head连接上之后,之后的连接就需要p2和p1来进行完成,不需要head了。如下图:
这是在循环创建时的几个过程。记得每开辟一个空间,需要给结构体中的数据赋值,即每一个结点赋值。
4)创建结束后,需要将p2的指针域指向NULL,代表整个链表结束,并且记得释放p1,因为p1的作用仅仅是为我们创建新的结点。
2 . 判空
链表的最后一个指针域是指向NULL的,所以我们只需要判断head是不是指向NULL即可,如果是,代表链表是空的,如果不是,代表链表有数据。
3 . 置空
同样,我们需要将头指针指向NULL即可。
4 . 删除
如图想要把中间的结点删除,需要将第一个结点的指针域指向第三个结点的地址,就可以实现在链表中将第二个结点删除。
5 . 增加、修改、逆序等见代码的详解。
6 . 详细代码
1)Head.h文件
#pragma once #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <iostream> //! \brief 一个关于“学生”的结构体类型 typedef struct Student { // 数据域(存储数据) int _age; //!< 年龄 char _name[20]; //!< 姓名 char _gender; //!< 性别 // 指针域(存储下一个节点的地址) Student *next; }LinkList; /* 这里是一些基本的链表操作的函数声明 */ // 创建一个链表 LinkList* create(unsigned int Number); // 判断链表是否为空 bool IsEmpty(LinkList L); // 将链表置空 void MakeLinkList(LinkList L); // 根据值查询位置 // 1:年龄 2:名字 3:性别 int Find1(LinkList *L, int Age); int Find2(LinkList *L, char *Name); int Find3(LinkList *L, char Gender); // 删除某个节点 bool Delete(LinkList *L, char *Name); // 增加一个节点 bool Push_Back(LinkList *L, LinkList *LNew); // 修改一个节点 bool Modify(LinkList *L, char *Name); // 打印整个链表 void PrintLinkList(LinkList* L); // 逆序整个链表 LinkList* Reverse(LinkList *L);2)Source.cpp文件
#include "Header.h" /* 这里是一些基本的链表操作的函数实现 */ LinkList* create(unsigned int Number) { // 声明三个结构体( 其中head是头节点,p1为临时节点,p2是辅助节点 ) LinkList *head, *p1 = NULL, *p2 = NULL; // 使得P1、P2指向空间大小为sizeof(LinkList)的内存空间 p1 = (LinkList*)malloc(sizeof(LinkList)); // 初始化head为NULL head = NULL; // 初始化第一个节点的数据 std::cin >> p1->_name >> p1->_age >> p1->_gender; // 循环创建、连接、初始化数据 for (size_t i = 0; i < Number - 1;) { // 连接节点 if (head == NULL) { head = p1; p2 = p1; } else { // 创建新的节点,并初始化新的节点 p1 = (LinkList*)malloc(sizeof(LinkList)); //scanf_s("%s %d %c", &p1->_name, &p1->_age, &p1->_gender); std::cin >> p1->_name >> p1->_age >> p1->_gender; p2->next = p1; p2 = p1; // add i++; } } // 使p2->next指向空,代表链表结束 p2->next = NULL; // 释放临时的p1 p1 = NULL; free(p1); return head; } bool IsEmpty(LinkList L) { return L.next == NULL; } void MakeLinkList(LinkList L) { L.next = NULL; } int Find1(LinkList *L, int Age) { int Location = 0; LinkList *P = L->next; while (P!= NULL&&P->_age != Age) { P = P->next; Location++; } return Location; } int Find2(LinkList *L, char *Name) { int Location = 0; LinkList *P = L; while (P!= NULL&&strcmp(P->_name,Name)) { P = P->next; Location++; } return Location; } int Find3(LinkList *L, char Gender) { int Location = 0; LinkList *P = L->next; while (P!=NULL&&P->_gender != Gender) { P = P->next; Location++; } return Location; } bool Delete(LinkList *L, char *Name) { // 两个临时的指针,其中第一个指针是保存目标节点的上一个节点 LinkList *TempPointer1 = L; LinkList *TempPointer2 = NULL; while (strcmp(TempPointer1->_name,Name) && TempPointer1 != NULL) { TempPointer2 = TempPointer1; TempPointer1 = TempPointer1->next; } if (TempPointer1 != NULL) { TempPointer2->next = TempPointer1->next; return true; } return false; } bool Push_Back(LinkList *L, LinkList *LNew) { // 将LNew加到L中 // 尾插 while (L!=NULL) { if (L->next == NULL) { L->next = LNew; break; } L = L->next; } return true; } bool Modify(LinkList *L, char *Name) { while (strcmp(L->_name,Name) && L!=NULL) { L = L->next; } if (L != NULL) { L->_age = 100; L->_gender = 'm'; return true; } return false; } void PrintLinkList(LinkList *L) { while (L!=NULL) { std::cout << L->_name << " " << L->_age << " " << L->_gender << std::endl; L = L->next; } } LinkList* Reverse(LinkList *L) { LinkList *PreLinkList = NULL; LinkList *Next; while (L!=NULL) { Next = L->next; L->next = PreLinkList; PreLinkList = L; L = Next; } return PreLinkList; }3)main.cpp文件
#include "Header.h" int main() { // 初始化并打印 // a242 ---------------------------------------------------------------- LinkList* head = create(3); std::cout << "Origin : " << std::endl; PrintLinkList(head); // 我是分割线 std::cout << "-----------------------------------------------------" << std::endl; // 1 . 增 //---------------------------------------------------------------- LinkList* NewLinkedList = create(2); Push_Back(head, NewLinkedList); std::cout << "Added : " << std::endl; PrintLinkList(head); // 我是分割线 std::cout << "-----------------------------------------------------" << std::endl; // 2 . 删 //---------------------------------------------------------------- Delete(head, "test2"); std::cout << "Deleted : " << std::endl; PrintLinkList(head); // 我是分割线 std::cout << "-----------------------------------------------------" << std::endl; // 3 . 改 //---------------------------------------------------------------- Modify(head, "test1"); std::cout << "Modified : " << std::endl; PrintLinkList(head); // 我是分割线 std::cout << "-----------------------------------------------------" << std::endl; // 4 . 查 //---------------------------------------------------------------- int Location = Find2(head, "test1"); std::cout << "Finded : " << Location << std::endl; // 我是分割线 std::cout << "-----------------------------------------------------" << std::endl; // 5 . 逆 LinkList* New = Reverse(head); std::cout << "Resversed : " << std::endl; PrintLinkList(New); std::cout << "---------------------Finished------------------------" << std::endl; system("pause"); return 0; }
相关文章推荐
- Qt操作SQLite数据库——创建、打开、关闭、增加、删除和修改操作
- AS3 操作XML,增加、删除、修改、查找
- C++单链表的创建插入删除以及逆序操作
- 利用JDOM及XPath对XML文件进行创建、查找、增加、删除、保存等操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 单链表的创建删除排序插入逆向打印各种操作
- go语言使用go-sciter创建桌面应用(二) ui元素查找,增加,删除,修改
- 单链表的创建、插入,删除、查找等操作
- <<< Oracle表创建、修改、删除基础操作
- JS的节点操作:创建、增加、删除、复制、查找
- 单链表-创建、插入、删除、查找、反转等操作
- c#环境XML文件创建、修改、删除、查找相关操作
- hibernate增加,删除,修改,查找操作
- 单链表的基本操作(初始化,建表,遍历,增加,删除,查找,逆序)等操作
- C语言实现链表的创建、增加、删除、查询、逆序、清空等基本操作
- 创建一个学生系统,实现一下功能; * 1:增加学生 * 2:显示学生 * 3:修改学生 * 4:删除学生 * 5:查找学生 * 6:退出程序 * 请输入选择(
- <长文本、二>SAP 通过BAPI创建、修改、读取以及删除
- 单链表创建-遍历-排序-插入-删除-逆序操作
- tinyxml使用:创建XML,遍历打印xml文件 select操作,获取单个节点值,删除节点操作,修改节点操作,增加节点操作
- 单链表的创建、初始化、插入、删除 、输出、求表长、清空、查找操作