链式存储:非连续内存存储,方便插入、删除。一般来说简单的链表,节点会有两个域,数据域和next域,next域一般指向下一个节点的位置。关于它的一些函数操作如下所示:
#include<iostream>
#include<stack>
using namespace std;
//带头节点的单链表
struct Node
{
int data;
Node *next;
};
bool Insert_head(Node *list,int value) //头插
{
if(list == NULL)
{
return false;
}
Node *node = new Node;
node->data = value;
node->next = list->next;
list->next = node;
return true;
}
bool Insert_tail(Node *list,int value)//尾插
{
if(list == NULL)
{
return false;
}
Node *node = new Node;
node -> data = value;
node ->next = NULL;
Node *p = list;
for(;p->next !=NULL;p=p->next );
p->next = node;
return true;
}
bool remove(Node *list,int value)//删除
{
Node *p = list;
for(;p->next !=NULL;p=p->next )
{
if(p->next ->data == value)
{
Node *q = p -> next;
p->next = q->next;
delete q;
return true;
}
}
return false;
}
void clear(Node **list)//清除
{
Node *p = *list;
for(;p!=NULL;p=p->next )
{
Node *q = p -> next;
p->next = q->next;
delete q;
}
delete p;
}
void Show(Node *list)//打印函数
{
if(list == NULL)
return;
Node *p = list ->next;
for(;p != NULL;p = p->next)
{
cout<<p->data<<" ";
}
cout<<endl;
}
/**********************************链表的逆置打印********************************************/
void Reverse_1(Node **list) //改变链表结构
{
if(*list == NULL)
{
return;
}
Node *p = (*list) ->next ; //因为要逆置,所以至少得需要三个指针,分别指向当前,当前的下一个,当前的下一个得下一个(因为改变了next域,就有可能找不到了)
Node *q = (*list) ->next->next ;
Node *s;
for(;q !=NULL;q = s)
{
s = q->next ;
q->next = p;
p = q;
}
(*list) ->next ->next = NULL;
(*list) ->next = p;
Show(*list);
}
void Reverse_2(Node *list)//不改变链表结构
{
//那么,是不是就是从尾到头打印呢;那就用栈咯
stack<int> s;
Node *p = list ->next ;
for(;p!=NULL;p=p->next )
{
s.push (p->data );
}
while(!s.empty())
{
cout<<s.top()<<" ";
s.pop();
}
cout<<endl;
}
void Reverse_3(Node *list)//不改变链表结构 能用栈也就能用递归了
{
if(list != NULL)
{
if(list ->next != NULL)
{
Reverse_3(list->next );
}
cout<<list->data<<" ";
}
}
int main()
{
Node *head = new Node;//申请一个头结点
head ->next = NULL;//把头结点的next域置为NULL
int arr[] = {1,5,8,3,2,48,56};
int brr[] = {100,10,11,12,56,8,9,2121};
int lenarr = sizeof(arr)/sizeof(arr[0]);
int lenbrr = sizeof(brr)/sizeof(brr[0]);
for(int i=0;i<lenarr;++i)
{
Insert_head(head,arr[i]); //头插
}
for(int i=0;i<lenbrr;++i)
{
Insert_tail(head,brr[i]); //尾插
}
Show(head);
remove(head,100);//删除
Show(head);
cout<<"*****1*****"<<endl;
Reverse_1(&head);
cout<<"*****2*****"<<endl;
Reverse_2(head);
cout<<"*****3*****"<<endl;
Reverse_3(head);
//clear(&head);
return 0;
}