单链表的基本操作

来源:互联网 发布:田井中彩智 现场 知乎 编辑:程序博客网 时间:2024/06/10 19:19

头文件:

#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int DataType;typedef struct Node{    DataType data;struct Node *next;}*PNode,Node;enum OP{EXIT,    PUSHBACK,POPBACK,PUSHFRONT,POPFRONT,FIND,INSERT,PRINT,ERASE,REMMOVE,REMMOVE_ALL,EMPTY,SIZE};void Init_LinkList(PNode *pHead);//初始化PNode BuyNode(DataType data);//创建新节点void PushBack(PNode *pHead,DataType data);//尾插void PopBack(PNode *pHead);//尾删void PushFront(PNode *pHead,DataType data);//头插void PopFront(PNode *pHead);//头删PNode Find(PNode pHead,DataType data);//查找值为data的节点位置void Insert(PNode pos,DataType data);//适当位置插入void Print_LinkList(PNode *pHead);//打印void Erase(PNode* pHead, PNode pos);// 删除链表Pos位置的元素void Remmove(PNode* pHead, DataType data);// 删除链表中第一个值为data的元素void RemmoveAll(PNode* pHead, DataType data);// 删除链表中所有值为Data的元素void Destroy(PNode* pHead);// 销毁链表int Empty(PNode pHead);// 链表是否为空int Size(PNode pHead);// 求链表中结点的个数

测试代码:

#define _CRT_SECURE_NO_WARNINGS 1#include"LinkList.h"void menu(){    printf("1.PushBack******************2.PopBack\n");printf("3.PushFront*****************4.PopFront\n");printf("5.Find**********************6.Insert\n");printf("7.Print_LinkList************8.Erase\n");printf("9.Remove********************10.RemoveAll\n");printf("11.Empty********************12.Size\n");printf("0.exit******************************\n");}int main(){PNode pNode;PNode position = NULL;int input = 1;Init_LinkList(&pNode);while(input){    menu();printf("请输入你的选择:");scanf("%d",&input);switch(input){    case PUSHBACK:{    DataType x = 0;printf("请输入你要插入的数据:");scanf("%d",&x);PushBack(&pNode,x);}break;case POPBACK:PopBack(&pNode);break;case PUSHFRONT:{    DataType x = 0;printf("请输入你要插入的数据:");scanf("%d",&x);PushFront(&pNode,x);}break;case POPFRONT:PopFront(&pNode);break;case FIND:{    DataType x = 0;printf("请输入你要查找的数据:");scanf("%d",&x);position = Find(pNode,x);if(NULL == position)printf("没找到所找元素\n");}break;case INSERT:{DataType x = 0;PNode ppos = position;printf("请输入你要插入的数据:");scanf("%d",&x);Insert(ppos,x);}break;case PRINT:Print_LinkList(&pNode);break;case ERASE:{PNode ppos = position;Erase(&pNode,ppos);}break;case REMMOVE:{DataType x = 0;printf("请输入你要删除的数据:");scanf("%d",&x);Remmove(&pNode,x);}break;case REMMOVE_ALL:{    DataType x = 0;printf("请输入你要删除的数据:");scanf("%d",&x);RemmoveAll(&pNode,x);}break;case EMPTY:{    int ret = Empty(pNode);    if(ret == 0)    printf("链表为空\n");    else    printf("链表不为空\n");}break;case SIZE:{    int sz = Size(pNode);    printf("单链表一共有%d个元素\n",sz);}break;case EXIT:Destroy(&pNode);break;default:printf("参数选择错误\n");break;}}    system("pause");return 0;}

函数实现:

#define _CRT_SECURE_NO_WARNINGS 1#include"LinkList.h"void Init_LinkList(PNode *pHead){    assert(pHead);*pHead = NULL;}PNode BuyNode(DataType data){PNode newNode = NULL;newNode = (PNode)malloc(sizeof(Node));if(NULL == newNode){    printf("out of memory.\n");exit(1);}else{newNode->data = data;newNode->next = NULL;}return newNode;}void PushBack(PNode *pHead,DataType data){    assert(pHead);if(NULL == *pHead)//链表无节点{*pHead = BuyNode(data);}else//有多个节点{PNode CurNode = *pHead;while(CurNode->next){CurNode = CurNode->next;}CurNode->next = BuyNode(data);}}void PopBack(PNode *pHead){    assert(pHead);if(NULL == *pHead)//链表无节点{return;}else if(NULL == (*pHead)->next)//链表只有一个节点{PNode DelNode = *pHead;free(DelNode);DelNode = NULL;*pHead = NULL;}else//有多个节点{PNode CurNode = *pHead;////方法1://PNode PreNode = *pHead;//while(CurNode->next)//找到最后一个节点//{//PreNode = CurNode;//CurNode = CurNode->next;//}//free(CurNode);//CurNode = NULL;//PreNode->next = NULL;//方法2:while(CurNode->next->next)//找到倒数第二个节点{CurNode = CurNode->next;}free(CurNode->next);CurNode->next = NULL;}}void PushFront(PNode *pHead,DataType data){PNode PreNode = NULL;PNode newNode = BuyNode(data);    assert(pHead);PreNode = *pHead;newNode->next = PreNode;*pHead= newNode;}void PopFront(PNode *pHead){PNode PreNode = *pHead;    PNode DelNode = *pHead;assert(pHead);if(NULL ==(*pHead))return;else if(NULL ==(*pHead)->next){    *pHead = NULL;free(DelNode);    DelNode = NULL;}else{    *pHead = DelNode->next;    free(DelNode);    DelNode = NULL;}}PNode Find(PNode pHead,DataType data){PNode CurNode = pHead;    assert(pHead);while(CurNode){if(CurNode->data == data)break;elseCurNode = CurNode->next;}return CurNode;}void Insert(PNode pos,DataType data)//在所给位置的后面插入{    PNode newNode = BuyNode(data);    PNode PreNode = pos;newNode->next = pos->next;PreNode->next = newNode;}void Print_LinkList(PNode *pHead){PNode CurNode = *pHead;    assert(pHead);while(CurNode){printf("%d->",CurNode->data);CurNode = CurNode->next;}printf("over\n");}void Erase(PNode* pHead, PNode pos)// 删除链表Pos位置的元素{PNode CurNode = *pHead;    assert(pHead);if(NULL == CurNode)//链表无元素return;else if(NULL == CurNode->next)//只有一个元素{if(CurNode == pos){    free(CurNode);*pHead = NULL;}else{ return;}}else{    PNode PreNode = *pHead;if(*pHead == pos)//第一个元素即为pos{CurNode = CurNode->next;PreNode = CurNode;free(pos);    pos = NULL;*pHead = PreNode;return;}while((CurNode != pos) && CurNode){PreNode= CurNode;CurNode = CurNode->next;}if(CurNode == NULL){     printf("没找到需要删除的位置\n"); return;}else{    PreNode->next = CurNode->next;    free(pos);    pos = NULL;}}}void Remmove(PNode* pHead, DataType data)// 删除链表中第一个值为data的元素{PNode CurNode = *pHead;    assert(pHead);if(NULL == CurNode)return;else{     PNode PreNode = *pHead;while(CurNode->data != data){PreNode = CurNode;CurNode = CurNode->next;}if(CurNode == NULL){     printf("没找到需要删除的位置\n"); return;}else{    PreNode->next = CurNode->next;    free(CurNode);    CurNode = NULL;}}}<pre name="code" class="cpp">void RemmoveAll(PNode* pHead, DataType data)// 删除链表中所有值为Data的元素{PNode CurNode = *pHead;PNode PreNode = *pHead;    assert(pHead);if(NULL == CurNode)//链表无元素return;while(*pHead)//判断第一个元素{    if(NULL == CurNode->next)//只有一个元素{if(CurNode->data == data){free(CurNode);*pHead = NULL;return;}}else if((*pHead)->data == data)//有多个元素,且第一个元素的值为data{*pHead = CurNode->next;free(CurNode);CurNode = *pHead;}elsebreak;}CurNode = CurNode->next;PreNode = *pHead;    while(CurNode){if(CurNode->data == data){PreNode->next = CurNode->next;free(CurNode);CurNode = PreNode;}PreNode = CurNode;CurNode = CurNode->next;}}
void Destroy(PNode* pHead)// 销毁链表{PNode CurNode = *pHead; assert(pHead);while(CurNode->next){ PNode DelNode = CurNode;CurNode = CurNode->next;free(DelNode);DelNode = NULL;}}int Empty(PNode pHead)// 链表是否为空{ assert(pHead);if(NULL == pHead)return 0;elsereturn 1;}int Size(PNode pHead)// 求链表中结点的个数{PNode CurNode = pHead;DataType num = 0; assert(pHead);while(CurNode){ num++;CurNode = CurNode->next;}return num;}



0 1