链表--基本算法
来源:互联网 发布:整合pdf的软件 编辑:程序博客网 时间:2024/06/07 12:24
#ifndef __LINKLIST_H__#define __LINKLIST_H__#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;typedef struct LinkNode{DataType data;struct LinkNode *next;}LinkNode, *pLinkNode;typedef struct LinkList{pLinkNode pHead;}LinkList,*pLinkList;void InitLinkList(pLinkList list);void DestoryList(pLinkList list);void PushBack(pLinkList list , DataType x);void PopBack(pLinkList list);void PushFront(pLinkList list , DataType x);void PopFront(pLinkList list);void PrintList(pLinkList list);pLinkNode Find(pLinkList list,DataType x);void Insert(pLinkList list, pLinkNode pos, DataType x);void Remove(pLinkList list, DataType x);void RemoveAll(pLinkList list, DataType x);void Erase(pLinkList list,pLinkNode pos);void BubbleSort(pLinkList list);void SelectSort(pLinkList list);void InsertSort(pLinkList list);#endif //__LINKLIST_H__#include"linklist.h"void CreateNode(pLinkNode *newNode, DataType x){*newNode = (pLinkNode)malloc(sizeof(LinkNode));if (NULL == *newNode){printf("out of memory\n");exit(EXIT_FAILURE);}(*newNode)->data = x;(*newNode)->next = NULL;}void InitLinkList(pLinkList list){assert(list);list->pHead = NULL;}void DestoryList(pLinkList list){assert(list);if (NULL==list->pHead) //空链表直接返回{return;}else{pLinkNode cur = list->pHead; //cur指向第一个结点while (cur != NULL) {list->pHead = cur->next; //pHead指向cur的下一个结点,当cur是最后一个结点时,pHead指向空free(cur);cur = list->pHead; //cur指向当前第一个结点,当链表为空时,cur指向空}}}void PushBack(pLinkList list, DataType x){assert(list);pLinkNode newNode = NULL;CreateNode(&newNode,x);if (NULL == (list->pHead)) //如果是空链表,直接插入头指针之后{list->pHead = newNode;}else{pLinkNode cur = list->pHead;while (NULL != (cur->next)) //找到最后一个结点cur{cur = cur->next;}cur->next = newNode;}}void PopBack(pLinkList list){assert(list);if (NULL == list->pHead){return;}else{pLinkNode cur = list->pHead;if (NULL == cur->next) //如果只有一个结点{free(cur);list->pHead= NULL;}else{while (NULL != cur->next->next) //大于一个结点,先找到倒数第二个结点{cur = cur->next;}free(cur->next);cur->next= NULL;}}}void PushFront(pLinkList list, DataType x) {assert(list);pLinkNode newNode = NULL;CreateNode(&newNode, x);newNode->next =list->pHead; //newNode的指针域先指向第一个结点list->pHead= newNode; //头指针指向newNode}void PopFront(pLinkList list){assert(list);if (NULL == list->pHead) //空链表{return;}pLinkNode cur = list->pHead; //cur指向第一个结点list->pHead = cur->next; //指向第一个结点的指针域free(cur);cur = NULL;}void PrintList(pLinkList list){assert(list);pLinkNode cur = list->pHead;while (NULL != cur){printf("%d->", cur->data);cur = cur->next;}printf("over\n");}pLinkNode Find(pLinkList list, DataType x){assert(list);pLinkNode cur = list->pHead;while (NULL != cur){if (cur->data == x){break;}cur = cur->next;}return cur; }void Insert(pLinkList list, pLinkNode pos, DataType x) //在pos后面插入元素{assert(list);pLinkNode newNode = NULL;CreateNode(&newNode, x);pLinkNode cur = list->pHead;while (NULL != cur) //先找到这个位置{if (cur == pos){break;}cur = cur->next;}if (NULL != cur){newNode->next=cur->next;cur->next = newNode;}else{printf("没有这个结点\n");}}void Remove(pLinkList list, DataType x){assert(list);pLinkNode cur = list->pHead;pLinkNode p = list->pHead;if (NULL == list->pHead) //空链表直接返回{return;}if (NULL == cur->next) //如果只有一个结点{if (cur->data == x){list->pHead = cur->next;free(cur);return;}}else{if (cur->data == x) //先判断第一个结点是不是要删除的结点{list->pHead = cur->next;free(cur);return;}cur = cur->next;while (NULL != cur){if (cur->data == x){p->next = cur->next; //p结点的指针域指向要删除结点的指针域free(cur);return;}p = cur;cur = cur->next;}}}void RemoveAll(pLinkList list, DataType x){assert(list);pLinkNode cur = list->pHead;pLinkNode p = NULL;if (NULL == list->pHead){return;}while (NULL != cur){if (NULL == list->pHead->next) //如果要只有一个结点{if (cur->data == x) //如果是则删除{list->pHead = cur->next;free(cur);return;}}else if (list->pHead->data == x) //判断是不是第一个结点,是则删除,继续判断{list->pHead = cur->next;free(cur);cur = list->pHead;}else{break;}}//要删除的结点在第一个结点之后cur = cur->next;p = list->pHead ;while (NULL != cur){if (cur->data == x){p->next = cur->next; //p结点的指针域指向要删除结点的指针域free(cur);cur = p;}p = cur;cur = cur->next;}}void Erase(pLinkList list, pLinkNode pos) //删除pos后面的结点{assert(list);pLinkNode cur = list->pHead;pLinkNode p = list->pHead;if (NULL == cur){return;}if (NULL == cur->next) //如果只有一个结点{if (cur == pos){free(cur);list->pHead = NULL;}}else{if (cur == pos) //如果是第一个结点{list->pHead = cur->next;free(cur);return;}cur = cur->next;while (NULL != cur){if (cur == pos){p->next = cur->next;free(cur);return;}p= cur;cur = cur->next;}}}void BubbleSort(pLinkList list){assert(list);pLinkNode cur = list->pHead;pLinkNode p1= list->pHead;int flag = 0;DataType tmp=0;if (NULL == list->pHead){return;}if (NULL == cur->next){return;}pLinkNode p2 = list->pHead->next;cur = cur->next;while (NULL!=cur){flag = 1;while (NULL != p2){if (p1->data > p2->data){tmp = p1->data;p1->data = p2->data;p2->data = tmp;flag = 0;}p2 = p2->next;p1 = p1->next;}if (flag){break;}p1 = list->pHead;p2 = list->pHead->next; cur = cur->next;}}#include"linklist.h"void Menu(){printf("**********************************\n");printf("*0.Quit 1.InitLinkList *\n");printf("*2.PushBack 3.PopBack *\n");printf("*4.PushFront 5.PopFront *\n");printf("*6.PrintList 7.Find *\n");printf("*8.Insert 9.Remove *\n");printf("*10.RemoveAll 11.Erase *\n");printf("*12.BubbleSort ****************\n");printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");printf("请选择:> ");}void test(){LinkList list;DataType x = 0;pLinkNode pos = NULL;int n = -1;while (1){Menu();scanf("%d", &n);switch (n){case 0:DestoryList(&list);exit(1);break;case 1:InitLinkList(&list);break;case 2:printf("请输入:>");scanf("%d",&x);PushBack(&list,x);break;case 3:PopBack(&list);break;case 4:printf("请输入:>");scanf("%d", &x);PushFront(&list,x);break;case 5:PopFront(&list);break;case 6:PrintList(&list);break;case 7:printf("请输入:>");scanf("%d", &x);pos=Find(&list,x);printf("查找成功\n");break;case 8:printf("请输入元素:>");scanf("%d", &x);Insert(&list,pos,x);break;case 9:printf("请输入:>");scanf("%d", &x);Remove(&list,x);break;case 10:printf("请输入:>");scanf("%d", &x);RemoveAll(&list,x);break;case 11:Erase(&list,pos);break;case 12:BubbleSort(&list);break;default:printf("选择无效,请重新选择\n");break;}}}int main(){test();system("pause");return 0;}
2 2
- 链表--基本算法
- 链表-基本算法(增、删)
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 基本算法
- 算法:基本排序算法
- 常用算法-基本算法
- 基本算法-分治算法
- 7.3 链表-单链表的基本算法
- 基本排序算法 - 基本知识点
- leetcode-Linked List Cycle-141
- PDO的使用
- 《代码整洁之道》读后总结 -- 关于注释
- ScrollView
- STM32F0xx_SPI读写(Flash)配置详细过程
- 链表--基本算法
- Jquery 中 ajaxSubmit使用讲解
- 构造函数、析构函数、拷贝构造函数小结
- Git的使用01
- windows+xshell+xming访问非桌面版Linux服务器
- C++实验7-特殊三位数
- openstack的win10镜像制作心得及教程(详细图文,面向小白)和对其他windows操作系统镜像制作的阐发
- SICP 习题1.44 smooth
- Scala基础