initlistpython_如何使用一个尾指针来达到单链表的连续插入?

单链表的操作

文档声明

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

case 5:ListPrint(L);break;

case 6:cin>>n;

insert(L,n);break;

case 7:cout<

case 8:cin>>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

LinkList p=new LNode;

if(t==L){

t=p;

}

cin>>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

LinkList p=new LNode;

cin>>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

p=p->next;

++j;

}

if(!p||j>i){

cout<

return -1;

}

return p->x;

}

9.ListDelete

Status ListDelete(LinkList &L,int i){

LinkList p=L;

int j=0;

while((p->next)&&(j

p=p->next;

++j;

}

if(!(p->next)||(j>i-1)){

cout<

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

cout<

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<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

return OK;

}

截图:

d76ce65271d4d335c5987fb3deccd209.png

全部代码展示

#include

#include

using namespace std;

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef 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

LinkList p=new LNode;

if(t==L){

t=p;

}

cin>>p->x;

p->next=L->next;

L->next=p;

}

}

void CreateList_R(LinkList &L,int n){

LinkList r=t;

for(int i=0;i

LinkList p=new LNode;

cin>>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

p=p->next;

++j;

}

if(!p||j>i){

cout<

return -1;

}

return p->x;

}

Status ListDelete(LinkList &L,int i){

LinkList p=L;

int j=0;

while((p->next)&&(j

p=p->next;

++j;

}

if(!(p->next)||(j>i-1)){

cout<

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

cout<

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<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

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<

case 5:ListPrint(L);break;

case 6:cin>>n;

insert(L,n);break;

case 7:cout<

case 8:cin>>n;

ListDelete(L,n);break;

case 9:return 0;

}

}

return 0;

}

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值