//写一个类
//要求
//1、使用该类创建一个对象 A a;之后,就自动建立了一个单链表的头
//2、类中的函数:a、可以往单链表中添加一个结点;b、可以将头结点的后继结点删除;
//3、当对象出作用域的时候,自动释放所有单链表的空间
//4、打印方式:C++ cout cin <<endl;
//5、内存申请与释放:new和delete;
//数组操作:
//delete new
//构造,析构
#include <iostream>
#include <Windows.h>
//检查内存泄露的代码
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
using namespace std;
struct node
{
int data;
node *next;
};
class linklist
{
private:
node *head;
public:
linklist();
void create();
void listlength();
void addlast();
void insert();
void delheadnext();
void display();
~linklist();
};
linklist::linklist()
{
head = new node;
head->next = NULL;
}
//后插法建立链表
void linklist::create()
{
node *p, *q;
p = head;
int temp = -1;
cin>>temp;
while (temp != -1)
{
//新节点
q = new node;
q->data=temp;
q->next=NULL;
//拼接
p->next = q;
p = q;
cin>>temp;
}
}
//返回链表的长度
void linklist::listlength()
{
int len = 0;
node *p = head;
while (p->next)
{
len++;
p = p->next;
}
cout<<endl<<"现在链表的长度是:"<<len<<endl;
}
//在最后插入一个值
void linklist::addlast()
{
node *p, *q;
int val;
cout<<"输入一个值:"<<'\t';
cin>>val;
cout<<"在最后插入值val:"<<val<<endl;
p = head;
q = new node;
q->data = val;
q->next = NULL;
while (p->next)
{
p = p->next;
}
p->next = q;
}
//在第pos位置插入一个val
void linklist::insert()
{
node *p, *q;
int i, val, pos;
i = 0;
cout<<"输入val的值:"<<'\t';
cin>>val;
cout<<"输入pos的值:"<<'\t';
cin>>pos;
cout<<"在"<<pos<<"后插入值:"<<val<<endl;
p = head;
while(pos > 0 && i< pos) {
while (p && i < pos)
{
p = p->next;
++i;
}
q = new node;
q->data = val;
q->next = p->next;
p->next = q;
}
}
//删除头结点之后的节点
void linklist::delheadnext()
{
cout<<"删除头结点之后的后继结点之后:"<<endl;
node *p;
//p=NULL
if(head->next)
{
p=head->next;
head->next= head->next->next;
delete p;
p=NULL;
}
}
//显示链表
void linklist::display()
{
node *p=head;
while (p->next)
{
cout<<p->next->data;
p = p->next;
cout<<'\t';
}
listlength();
cout<<endl;
}
linklist::~linklist()
{
node *p;
while (head->next)
{
p = head;
head = head->next;
delete p;
p=NULL;
}
delete head;
head=NULL;
}
int main()
{
linklist list;
cout<<"输入链表:"<<endl;
list.create();
list.display();
list.addlast();
list.display();
list.insert();
list.display();
list.delheadnext();
list.display();
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}
//要求
//1、使用该类创建一个对象 A a;之后,就自动建立了一个单链表的头
//2、类中的函数:a、可以往单链表中添加一个结点;b、可以将头结点的后继结点删除;
//3、当对象出作用域的时候,自动释放所有单链表的空间
//4、打印方式:C++ cout cin <<endl;
//5、内存申请与释放:new和delete;
//数组操作:
//delete new
//构造,析构
#include <iostream>
#include <Windows.h>
//检查内存泄露的代码
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
using namespace std;
struct node
{
int data;
node *next;
};
class linklist
{
private:
node *head;
public:
linklist();
void create();
void listlength();
void addlast();
void insert();
void delheadnext();
void display();
~linklist();
};
linklist::linklist()
{
head = new node;
head->next = NULL;
}
//后插法建立链表
void linklist::create()
{
node *p, *q;
p = head;
int temp = -1;
cin>>temp;
while (temp != -1)
{
//新节点
q = new node;
q->data=temp;
q->next=NULL;
//拼接
p->next = q;
p = q;
cin>>temp;
}
}
//返回链表的长度
void linklist::listlength()
{
int len = 0;
node *p = head;
while (p->next)
{
len++;
p = p->next;
}
cout<<endl<<"现在链表的长度是:"<<len<<endl;
}
//在最后插入一个值
void linklist::addlast()
{
node *p, *q;
int val;
cout<<"输入一个值:"<<'\t';
cin>>val;
cout<<"在最后插入值val:"<<val<<endl;
p = head;
q = new node;
q->data = val;
q->next = NULL;
while (p->next)
{
p = p->next;
}
p->next = q;
}
//在第pos位置插入一个val
void linklist::insert()
{
node *p, *q;
int i, val, pos;
i = 0;
cout<<"输入val的值:"<<'\t';
cin>>val;
cout<<"输入pos的值:"<<'\t';
cin>>pos;
cout<<"在"<<pos<<"后插入值:"<<val<<endl;
p = head;
while(pos > 0 && i< pos) {
while (p && i < pos)
{
p = p->next;
++i;
}
q = new node;
q->data = val;
q->next = p->next;
p->next = q;
}
}
//删除头结点之后的节点
void linklist::delheadnext()
{
cout<<"删除头结点之后的后继结点之后:"<<endl;
node *p;
//p=NULL
if(head->next)
{
p=head->next;
head->next= head->next->next;
delete p;
p=NULL;
}
}
//显示链表
void linklist::display()
{
node *p=head;
while (p->next)
{
cout<<p->next->data;
p = p->next;
cout<<'\t';
}
listlength();
cout<<endl;
}
linklist::~linklist()
{
node *p;
while (head->next)
{
p = head;
head = head->next;
delete p;
p=NULL;
}
delete head;
head=NULL;
}
int main()
{
linklist list;
cout<<"输入链表:"<<endl;
list.create();
list.display();
list.addlast();
list.display();
list.insert();
list.display();
list.delheadnext();
list.display();
_CrtDumpMemoryLeaks();
system("pause");
return 0;
}