//linked_list.cpp
#include <iostream>
using namespace std;
#define END -1 //插入法创建链表时的结束标志
typedef int ElemType; //取元素类型为int
//定义状态信息
enum Status {
ERROR = -1,
SUCCESS = 0
};
//节点定义
struct Node {
ElemType data;
Node *next;
};
class LinkedList {
public :
LinkedList();
~LinkedList();
Status CreateList_R(); //表尾插入法建立链表
Status CreateList_H(); //表头插入法建立链表
Status InsertElem(int loc, const ElemType e); //在链表的指定位置插入元素
Status DeleteElem(int loc); //删除链表指定位置的元素
Status GetElem(int loc, ElemType &e); //获取链表指定位置的元素,通过引用方式传出
Node *Locate(const ElemType e); //获取给定元素在链表中的位置,以指针形式给出
Node *GetHead(); //获取链表表头指针
int GetLength(); //获取链表长度
void printList(); //打印链表内元素数据值
private :
Node *head;
};
//带头节点的链表初始化
LinkedList::LinkedList() {
head = new Node;
head->next = NULL;
}
LinkedList::~LinkedList() {
delete head;
}
//表尾插入法建立链表
Status LinkedList::CreateList_R() {
ElemType x;
cin >> x;
Node *rear = head;
while (x != END) {
Node *s = new Node;
s->data = x;
rear->next = s;
rear = s;
rear->next = NULL;
cin >> x;
}
return SUCCESS;
}
//表头插入法建立链表
Status LinkedList::CreateList_H() {
ElemType x;
cin >> x;
while (x != END) {
Node *s = new Node;
s->data = x;
s->next = head->next;
head->next = s;
cin >> x;
}
return SUCCESS;
}
//在链表的指定位置插入元素
Status LinkedList::InsertElem(int loc, const ElemType e) {
Node *p = head;
int i = 0;
while (i != loc - 1 && p != NULL) {
p = p->next;
i++;
}
if (p == NULL)
return ERROR;
Node *s = new Node;
s->data = e;
s->next = p->next;
p->next = s;
return SUCCESS;
}
//删除链表指定位置的元素
Status LinkedList::DeleteElem(int loc) {
Node *p = head;
int i = 0;
while (i != loc - 1 && p != NULL) {
p = p->next;
i++;
}
if (p == NULL) {
return ERROR;
}
Node *u = p->next;
p->next = u->next;
delete u;
return SUCCESS;
}
//获取链表指定位置的元素,通过引用方式传出
Status LinkedList::GetElem(int loc, ElemType &e) {
Node *p = head;
int i = 0;
while (i != loc && p != NULL) {
p = p->next;
i++;
}
if (p == NULL) {
return ERROR;
}
e = p->data;
return SUCCESS;
}
//获取给定元素在链表中的位置,以指针形式给出
Node *LinkedList::Locate(const ElemType e) {
Node *p = head->next;
while (p != NULL) {
if (p->data = e) {
return p;
}
p = p->next;
}
return NULL;
}
//获取链表表头指针
Node *LinkedList::GetHead() {
return head;
}
//获取链表长度
int LinkedList::GetLength() {
Node *p = head->next;
int cnt = 0;
while (p != NULL) {
cnt++;
p = p->next;
}
return cnt;
}
//打印链表内元素数据值
void LinkedList::printList() {
Node *p = head->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LinkedList L;
int a, b, c, d;
int x;
cout << "请依次输入链表的元素值,以空格间隔, 输入-1以结束输入" << endl;
L.CreateList_R();
// L.CreateList_H();
cout << "链表内的元素值依次为:" << endl;
L.printList();
cout << "链表的长度为:" << L.GetLength() << endl;
/*
cout << "请输入需要查找的元素:";
cin >> x;
cout << "元素的地址为:" << L.Locate(x) << ", 值为:" << L.Locate(x)->data << endl;
*/
cout << "请输入需要删除的元素的位置:";
cin >> a;
L.DeleteElem(a);
cout << "修改后的链表内的元素值依次为:" << endl;
L.printList();
cout << "请输入需要删除的元素的位置:";
cin >> b;
L.DeleteElem(b);
cout << "修改后的链表内的元素值依次为:" << endl;
L.printList();
cout << "请输入需要插入的元素及其位置(位置在前,元素在后,用空格隔开):";
cin >> c >> d;
L.InsertElem(c, d);
cout << "修改后的链表内的元素值依次为:" << endl;
L.printList();
return 0;
}