链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,这里介绍单链表。
我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表可以满足我们这种需求。它在程序的执行过程中根据需要,有数据存储就向系统要求申请存储空间,不会对存储区的浪费。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员和指向下一个结构体类型节点的指针。
c++代码
#include<iostream>
using namespace std;
//定义节点
struct node
{
int data;
node *next;
};
//定义节点类
class list
{
public:
list();
void insert(int val);
void reverse();
void updata(int val,int add_val);
void remove(int val);
void print();
private:
node *head;
node* find(int val);
};
//查找节点位置的函数
node* list::find(int val)
{
node *p=head;
for(;p;p=p->next)
{
if(p->next->data==val)
break;
}
return p;
}
list::list()//这是构造函数,初始化对象的数据成员,小工程可使用系统默认的析构函数
{
head=NULL;//头结点不放数据
}
//按顺序插入
void list::insert(int val)
{
node *p=new node();
p->data=val;
p->next=NULL;
if(head==NULL) //空链表
{
head=p;
}
else
{
node *q,*r;
q=head;
while(q&&q->data<=p->data)
{
r=q;
q=q->next;
}
if(q!=NULL)
{
p->next=q;
r->next=p;
}
else
{
p->next=NULL;
r->next=p;
}
}
}
//翻转元素
void list::reverse()
{
if(head==NULL)
return;
node * p = head;
node * q = head->next;
node * temp;
while(q)
{
temp=q->next;
q->next=p;
p=q;
q=temp;
}
head->next=NULL;
head=p;
}
//更新指定数据
void list::updata(int val,int add_val)
{
node *p=find(val);
p->next->data=add_val;
}
//删除元素
void list::remove(int val)
{
if(head==NULL)
{
cout<<"链表为空时不能删除元素"<<endl;
}
else if(head->data==val)
{
head=head->next;
}
else
{
int flag=1;//删除完全标志
while(flag)
{
node *p=head;
node *q;
while(p&&p->data!=val)
{
q=p;
p=p->next;
}
if(p)
q->next=p->next;
else
flag=0;
}
}
}
//输出
void list::print()
{
node *p;
p=head;
if(head==NULL)
{
cout<<"链表为空"<<endl;
}
else
{
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
}
int main()
{
list List;
for(int i=0;i<20;++i)
List.insert(i+1);
cout<<"单链表为:";
List.print();
List.reverse();
cout<<"翻转后的链表为:";
List.print();
List.updata(5,555);
cout<<"更新数据后的链表为(这里将5替换为555):";
List.print();
List.remove(10);
cout<<"删除元素10后的链表为:";
List.print();
return 0;
}
运行结果