您的位置:首页 > 其它

单循环链表实现

2015-10-24 11:09 253 查看
单循环链表的实现是基于单链表来的,但是也有所同...

单循环链表中,其链表结束标志是p!=head or p-next!=NULL.这也为后面带来一些困扰...如遍历时不能从p=head开始...

在插入过程中,由于p=head->next所以如果一开始不对pos==1进行判断,则无法将元素插在head结点后面,所以一下操作是必须的:

if (pos == 1){ Node *s = new Node; s->data = elem; s->next = head->next; head->next = s; return true; }在删除时为了简单我直接是利用在单链表中提到的p->next!=NULL来修改的即:
while (p->next != head && i < pos - 1){
i++;
p = p->next;
}下面是完成代码:
#ifndef RLINKLIST_H
#define RLINKLIST_H
struct Node{
int data;
Node *next;
};
class rLinkList{

private:
Node *head;

public:
rLinkList();
~rLinkList();
void display() const;
void createFList(const int *num, int size);
bool insertElem(int pos, int elem);
bool deleteElem(int pos, int &elem);
int location(int elem) const;
Node *getElem(int pos);

};

#endif
实现:
#include"rLinkList.h"
#include<iostream>
using namespace std;

rLinkList::rLinkList(){
head = new Node;
head->next = head;
}

rLinkList::~rLinkList(){
Node *pre = head, *p = head->next;
while (p != head){
delete pre;
pre = p;
p = p->next;
}
delete pre;
}

void rLinkList::display() const{
Node *p = head->next;
while (p != head){
cout << p->data << " ";
p = p->next;
}
cout << endl;
}

bool rLinkList::insertElem(int pos, int elem){

if (pos < 1) return false;

if (pos == 1){ Node *s = new Node; s->data = elem; s->next = head->next; head->next = s; return true; }

Node *p = head->next;

int i = 1;

while (p != head && i < pos - 1){
i++;
p = p->next;
}
if (p == head) return false;

Node *s = new Node;
s->data = elem; s->next = p->next; p->next = s;
return true;
}

bool rLinkList::deleteElem(int pos, int &elem){

if (pos < 1) return false;
Node *p = head; //Node *p=head , int i=0;在
int i = 0;

while (p->next != head && i < pos - 1){
i++;
p = p->next;
}
if (p->next == head) return false;

Node *q = p->next; elem = q->data;
p->next = q->next;
delete q;
return true;

}

int rLinkList::location(int elem) const{

Node *p = head->next;

int i = 1;

while (p != head && p->data != elem){ p = p->next; i++; }

if (p == head) return 0;

return i;
}

void rLinkList::createFList(const int *num, int size){

for (int i = 0; i < size; i++){
Node *s = new Node;
s->data = num[i];
s->next = head->next;
head->next = s;
}
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: