c语言pre指针,求解答……怎么在主程序里设置工作指针pre,p指向第二个节点

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

链表头文件

//循环单链表类的定义

template

struct Node

{

T data;

Node *next;

};

template

class CLinkList

{

public:

Node *Head;

CLinkList() ;//构造函数, 创建空单循环链表

~CLinkList();//析构函数,删除表空间

void CreateList(int n);//创建具有n个元素的单循环链表

void Insert(int i,T e);//在表中第i个位置插入元素

T Delete(int i);//删除表中第i个元素

T GetElem(int i);//获取第i个元素的值

int Locate(T e);//在链表中查找值为e的元素

T prior(T e);//返回元素e的前驱

int Empty();//测表空

int Length();//测表长

//void CLear();//清空表

void ListDisplay();//输出表元素

};

//循环单链表类的实现

template

CLinkList::CLinkList()//构建函数,建一空单循环链表

{

Head=new Node;

Head->next=Head;

}

template

CLinkList::~CLinkList()//析构函数,释放链表所占空间

{

Node *p,*q;

q=Head;

while(q->next!=Head) q=q->next; //定位q到尾结点

while(Head!=Head->next)

{//从头结点开始,依次释放结点

p=Head;

Head=Head->next;

q->next=Head;

delete p;

}

Head=NULL;//头结点指向空

}

template

void CLinkList::CreateList(int n)

{//尾插法(正序)创建具有n个元素的单循环链表

Node *p,*s;//设置工作指针。p指向尾结点

p=Head;

//cout<

for(int i=1;i<=n;i++)

{

s=new Node;//新建元素结点

s->data=i;//输入新建数据元素值

s->next=p->next;//新结点链入表尾

p->next=s;

p=s;

}

}

template

void CLinkList::Insert (int i,T e)

{//在指定位置插入元素

int j=0;

Node *p;

p=Head;//工作指针初始化

while(p->next!=Head&& j

{

p=p->next;//

j++;

}

if(p->next==Head||j>i-1) throw"位置异常";//插入位置不合理,i<0或i>表长

else

{

Node *s;

s=new Node;//

s->data=e;//

s->next=p->next;//结点S链接到p结点之后

p->next=s;//

}

}

template

T CLinkList::Delete (int i)

{//删除指定位置元素

T x;

Node *p,*q;//设置工作指针

p=Head;//查找从头结点开始

int j=0;//计数器初始化

while(p->next!=Head && j

{

p=p->next;//

j++;

}

if(p->next==Head||j>i-1) throw"位置异常";//删除位置不合理

else //删除位置合理

{

q=p->next;// 暂存删除结点位置

p->next=q->next;//从链表中摘除删除结点

x=q->data;//取删除数据元素的值

delete q;// 释放删除点

return x;//返回删除元素的值

}

}

template

int CLinkList::Locate (T e)

{//按值定位

int j=1;

Node *p;

p=Head->next;

while(p!=Head && p->data!=e)

{

p=p->next;

j++;

}

if(p==Head) return 0;

else return j;

}

template

T CLinkList::GetElem(int i)

{//获取第i个元素的值

Node *p;//设置工作指针

p=Head->next;//从首结点开始

int j=1;//计数器初始化

while(p!=Head&&j

{

p=p->next;j++;

}

if(p==Head||j>i)//定位位置不合理:空表或i小于0或i大于表长

throw "位置不合理";

else //位置合理

return p->data;

}

template

int CLinkList::Empty()

{//测表空

if(Head->next==Head)

return 1;

else

return 0;

}

template

T CLinkList::prior(T e)

{//返回元素前驱

Node *p,*q;

p=Head;q=p->next;

while(q!=Head&&q->data!=e)

{

p=q;q=q->next;

}

if(p==Head) //首元素,其前驱为尾元素????

throw"首元素,无前驱";

else if(q==Head)

throw"元素不存在";

else

return p->data;

}

template

int CLinkList::Length()

{

int len=0;//

Node *p;

p=Head;//指向头结点

while(p->next!=Head)

{

len++;p=p->next;

}

return len;

}//Length

template

void CLinkList::ListDisplay()

{//显示链表

Node *p;

p=Head->next;

int i=1;

while(p!=Head)

{

cout<

cout<data<

p=p->next;

i++;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值