这次关于单链表的一些操作以及实现
话不多说,直接上代码
#include <iostream>
using namespace std;
struct Lnode
{
int data;
Lnode *next;
};
class LinkList
{
public:
LinkList();
LinkList(int a[],int n);
~LinkList();
void PrintList();
void insert(int i, int x); //在第i个元素的位置插入值为x的元素
int Delete(int i); //删除第i个位置的元素
int locate(int x); // 查找第i个元素位置的值
int empty(); //判断链表为空
int length(); //链表内的长度
int get(int i); //获取链表头结点的元素
private:
Lnode* head; //定义链表的头指针
};
LinkList::LinkList() //无参构造函数
{
head = new Lnode; //建立头结点
head->next = NULL;
}
LinkList::LinkList(int a[], int n) //有参构造函数
{
head = new Lnode;
Lnode *p = head;
Lnode *q = NULL;
for(int i = 0;i < n;i++)
{
q = new Lnode;
q->data = a[i];
p->next = q;
p = q;
}
p->next = NULL;
//1.头插法
// head = new Lnode;
// head->next = NULL;
// for(int i = 0;i < n;i++)
// {
// Lnode *s = NULL;
// s = new Lnode;
// s->data = a[i];
// s->next = head->next;
// head->next = s;
// }
//2.尾插法
head = new Lnode;
Lnode *r = head;
Lnode *s = NULL;
for(int i = 0;i < n;i++)
{
s = new Lnode;
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
LinkList::~LinkList()
{
Lnode *p = head;
while(head != NULL)
{
head = head->next;
delete p;
p = head;
}
}
void LinkList::insert(int i, int x)
{
Lnode *p = head;
Lnode *s = NULL;
int count = 0;
while(p != NULL && count < i-1) //i=2
{
p = p->next;
count++;
}
cout << "count=" << p->data << endl;
if(p == NULL) throw"插入位置错误";
else
{
s = new Lnode;
s->data = x;
s->next = p->next;
p->next = s;
}
}
int LinkList::Delete(int i)
{
int x;
Lnode *p = head;
Lnode *q = NULL;
int count = 0;
while(p != NULL && count < i-1)
{
p = p->next;
count++;
}
if(p == NULL || p->next == NULL) throw"删除位置错误";
else
{
q = p->next;
x = q->data;
p->next = q->next;
delete q;
return x;
}
}
int LinkList::get(int i)
{
Lnode *p = head->next;
int count = 1;
while(p != NULL && count < i)
{
p = p->next;
count++;
}
if(p == NULL) throw"查找位置错误";
else return p->data;
}
int LinkList::locate(int x)
{
Lnode *p = head->next;
int count = 1;
while(p != NULL)
{
if(p->data == x) return count;
p = p->next;
count++;
}
return 0;
}
int LinkList::empty()
{
if(head->next == NULL) return 0;
else return 1;
}
int LinkList::length()
{
Lnode *p = head->next;
int count = 0;
while(p != NULL)
{
p = p->next;
count++;
}
return count;
}
void LinkList::PrintList()
{
Lnode *p;
p = head->next;
while(p != NULL)
{
cout << p->data << " ";
p = p->next;
}
}
int main()
{
int r[5] = {1,2,3,4,5};
int i,x;
LinkList l(r, 5);
l.PrintList();
try {
cout << "插入后数据为:";
l.insert(2, 8);
l.PrintList();
}
catch(char *str) {
cout << str << endl;
}
cout << "长度:" << l.length() << endl;
cout << "请输入查找的元素:";
cin >> x;
i = l.locate(x);
if(i > 0) cout << "元素" << x << "的位置为" << i << endl;
else {
cout << "单链表中没有元素" << x << endl;
}
try
{
cout << "请输入要删除第几个元素:";
cin >> i;
x = l.Delete(i);
cout << "删除的元素值是" << x << ",执行删除操作后的数据为:";
l.PrintList();
}catch(char *str){cout << str << endl;
}
return 0;
}
这次也是跟着书敲了一遍,来复习复习一些小的细节。