博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用一个尾指针来达到单链表的连续插入?
阅读量:5319 次
发布时间:2019-06-14

本文共 5687 字,大约阅读时间需要 18 分钟。

目录

单链表的操作

文档声明

本链表仅有的特殊之处就是设置了一个尾指针,以便达到前插法、后插法插入数据之前不会重置表的目的,简单说就是一个表,按照书上的写法,前插1,2,3,后插1,2,3之后链表是1 2 3。我的写法链表会是3->2->1->1->2->3。

创建单链表

1.头文件及宏定义

#include
#include
using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2

2.定义链表结构体及类型重定义

typedef int Status;typedef struct LNode{    int x;    struct LNode *next;}LNode,*LinkList;//上边那步可以分解为/*struct LNode{    int x;    struct LNode *next;};typedef struct LNode LNode;typedef struct LNode *LinkList;*/

3.声明函数以及定义全局变量

LinkList t;//尾指针Status initList(LinkList &L);//初始化链表void CreateList_L(LinkList &L,int n);//左(前)插法插入n个数据void CreateList_R(LinkList &L,int n);//右(后)插法插入n个数据Status GetElem(LinkList L,int i);//返回第i个结点的值Status ListDelete(LinkList &L,int i);//删除第i个结点void ListPrint(LinkList L);//遍历链表void insert(LinkList &L,int i);//在第i个结点后插入一个结点Status findMax(LinkList L);//找出这个链表中的最大值Status print();//菜单界面

4.主函数

int main(){        int x=0,n=0;    LinkList L;    while(1){        print();        cin>>x;        switch(x){                        case 1:initList(L);break;            case 2:cin>>n;            CreateList_L(L,n);break;            case 3:cin>>n;            CreateList_R(L,n);break;            case 4:cin>>n;            cout<
<
>n; insert(L,n);break; case 7:cout<
<
>n; ListDelete(L,n);break; case 9:return 0; } } return 0;}

5.initList

Status initList(LinkList &L){    L=new LNode;    L->next=NULL;    t=L;    return OK;}

6.CreateList_L

void CreateList_L(LinkList &L,int n){    for(int i=0;i
>p->x; p->next=L->next; L->next=p; }}

7.CreateList_R

void CreateList_R(LinkList &L,int n){    LinkList r=t;    for(int i=0;i
>p->x; p->next=NULL; r->next=p; r=p; } t=r;}

8.GetElem

Status GetElem(LinkList L,int i){    LinkList p=L->next;    int j=1;    while(p&&j
next; ++j; } if(!p||j>i){ cout<<"您要查找的元素不合法\n错误:"; return -1; } return p->x;}

9.ListDelete

Status ListDelete(LinkList &L,int i){    LinkList p=L;    int j=0;    while((p->next)&&(j
next; ++j; } if(!(p->next)||(j>i-1)){ cout<<"您要删除的元素不合法\n错误:-1\n"; return -1; } LinkList q=p->next; p->next=q->next; delete q; return OK;}

10.ListPrint

void ListPrint(LinkList L){    LinkList p=L->next;    if(p!=NULL){        printf("%d",p->x);        p=p->next;    }    while(p!=NULL){        printf("->%d",p->x);        p=p->next;    }    printf("\n");}

11.insert

void insert(LinkList &L,int i){    LinkList p=L;    while(i--&&p){        p=p->next;    }    if(p==NULL||i<-1){        cout<<"您要插入的位置不合法\n错误:-1\n";        return;    }    LinkList q=new LNode;    cin>>q->x;    q->next=p->next;    p->next=q;}

12.findMax

Status findMax(LinkList L){    if(L->next==NULL)return 0;    LinkList p=new LNode;    p=L->next;    int max1=p->x;    while(p->next){        p=p->next;        max1=max(p->x,max1);    }    return max1;}

13.print

Status print(){    cout<<"==========================================\n";    cout<<"1.创建一个空表\n";    cout<<"2.前插法插入n个数据\n";    cout<<"3.后插法插入n个数据\n";    cout<<"4.获取第n个结点的值\n";    cout<<"5.遍历链表\n";    cout<<"6.在第n个结点后插入一个结点\n";    cout<<"7.找出这个链表的最大值\n";    cout<<"8.删除第n个结点\n";    cout<<"9.退出系统\n";    cout<<"==========================================\n";     return OK;}

全部代码展示

#include
#include
using namespace std;#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef struct LNode{ int x; struct LNode *next;}LNode,*LinkList;LinkList t;Status initList(LinkList &L){ L=new LNode; L->next=NULL; t=L; return OK;}void CreateList_L(LinkList &L,int n){ for(int i=0;i
>p->x; p->next=L->next; L->next=p; }}void CreateList_R(LinkList &L,int n){ LinkList r=t; for(int i=0;i
>p->x; p->next=NULL; r->next=p; r=p; } t=r;}Status GetElem(LinkList L,int i){ LinkList p=L->next; int j=1; while(p&&j
next; ++j; } if(!p||j>i){ cout<<"您要查找的元素不合法\n错误:"; return -1; } return p->x;}Status ListDelete(LinkList &L,int i){ LinkList p=L; int j=0; while((p->next)&&(j
next; ++j; } if(!(p->next)||(j>i-1)){ cout<<"您要删除的元素不合法\n错误:-1\n"; return -1; } LinkList q=p->next; p->next=q->next; delete q; return OK;}void ListPrint(LinkList L){ LinkList p=L->next; if(p!=NULL){ printf("%d",p->x); p=p->next; } while(p!=NULL){ printf("->%d",p->x); p=p->next; } printf("\n");}void insert(LinkList &L,int i){ LinkList p=L; while(i--&&p){ p=p->next; } if(p==NULL||i<-1){ cout<<"您要插入的位置不合法\n错误:-1\n"; return; } LinkList q=new LNode; cin>>q->x; q->next=p->next; p->next=q;}Status findMax(LinkList L){ if(L->next==NULL)return 0; LinkList p=new LNode; p=L->next; int max1=p->x; while(p->next){ p=p->next; max1=max(p->x,max1); } return max1;}Status print(){ cout<<"==========================================\n"; cout<<"1.创建一个空表\n"; cout<<"2.前插法插入n个数据\n"; cout<<"3.后插法插入n个数据\n"; cout<<"4.获取第n个结点的值\n"; cout<<"5.遍历链表\n"; cout<<"6.在第n个结点后插入一个结点\n"; cout<<"7.找出这个链表的最大值\n"; cout<<"8.删除第n个结点\n"; cout<<"9.退出系统\n"; cout<<"==========================================\n"; return OK;}int main(){ int x=0,n=0; LinkList L; while(1){ print(); cin>>x; switch(x){ case 1:initList(L);break; case 2:cin>>n; CreateList_L(L,n);break; case 3:cin>>n; CreateList_R(L,n);break; case 4:cin>>n; cout<
<
>n; insert(L,n);break; case 7:cout<
<
>n; ListDelete(L,n);break; case 9:return 0; } } return 0;}

转载于:https://www.cnblogs.com/zhangA/p/9840378.html

你可能感兴趣的文章
给C#学习者的建议 - CLR Via C# 读后感
查看>>
Recover Binary Search Tree
查看>>
Java 实践:生产者与消费者
查看>>
[转]IOCP--Socket IO模型终结篇
查看>>
js 获取视频的第一帧
查看>>
各种正则验证
查看>>
观察者模式(Observer)
查看>>
python中numpy.r_和numpy.c_
查看>>
egret3D与2D混合开发,画布尺寸不一致的问题
查看>>
freebsd 实现 tab 命令 补全 命令 提示
查看>>
struts1和struts2的区别
查看>>
函数之匿名函数
查看>>
shell习题第16题:查用户
查看>>
实验4 [bx]和loop的使用
查看>>
Redis常用命令
查看>>
2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
查看>>
2019.02.15 bzoj5210: 最大连通子块和(链分治+ddp)
查看>>
redis cluster 集群资料
查看>>
微软职位内部推荐-Sr. SE - Office incubation
查看>>
微软职位内部推荐-SOFTWARE ENGINEER II
查看>>