单循环链表实现
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;
}
}
单循环链表中,其链表结束标志是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;
}
}
相关文章推荐
- leetcode Unique Paths II
- windows下 Codeblocks 搭建 Objective-c 开发环境
- Android Studio使用说明
- HDU 5468 Puzzled Elena
- Spring AOP的底层实现技术
- jquery 通知提示框教程
- Framework目录一阅
- iOS常见问题---const和volatile
- Java-ServletRequestListener-ServletRequestAttributeListener
- Java-ServletRequestListener-ServletRequestAttributeListener
- 协同过滤工具推荐
- Android Universal Image Loader 使用详解
- MySQL [Warning]: IP address 'xxxx' could not be resolved: Name or service not known
- Combinations
- 【FastDev4Android框架开发】Android 列表下拉刷新组件PullToRefreshListView使用(三)
- DOM要点总结
- 将上传文件添加到数据库
- [洛谷1387]最大正方形
- 分分钟学会一门语言之Python篇
- 关于闭包