從今天開始學習資料結構(c++/c)---連結串列
阿新 • • 發佈:2019-01-31
先實現這麼多功能,後續再填程式碼(本人一菜渣,c式鬧著玩程式設計如下):
#include <iostream>
using namespace std;
struct Node{
int value;
Node *next;
};
//尾插法
void insertNode(Node *p,int i){
Node *q=p;
while(q->next!=NULL)
{
q=q->next;
}
Node *node=new Node;
node->value=i;
q->next =node;
node->next=NULL;
}
// 刪除某值
void deleteNode(Node *p,int key)
{
Node *pre=p;
Node *q=pre->next;
while(q!=NULL)
{
if(q->value==key)
{
pre->next=q->next;
q=q->next;
}else{
pre=pre->next;
q=pre->next ;
}
}
}
//更新某值
void updateKey(Node *p,int key,int newkey)
{
Node *q=p;
while(q!=NULL)
{
if(q->value==key)
{
q->value=newkey;
}
q=q->next;
}
}
//查詢某值,將下標位置儲存到a陣列中
int SelectKey(Node *p,int key,int a[]){
Node *q=p;
int i=0,count=0;
while(q!=NULL)
{
if(q->value==key)
a[i++]=count;
q=q->next;
count+=1;
}
return i;
}
//實現連結串列翻轉
void reverseList(Node *p)
{
Node *q=p->next,*m;
Node *temp=q->next;
q->next=NULL;
while(temp!=NULL)
{
m=temp->next;
temp->next=q;
q=temp;
temp=m;
}
p->next=q;
}
//從後查詢某位置的值
int findNodeFromBack(Node *p,int i)
{
Node *q=p,*w=p;
int count=0,key,k=0;
while(q->next!=NULL)
{
q=q->next;
count+=1;
}
while(w->next!=NULL)
{
if((count-i)==k)
{
return w->value;
}
w=w->next;
k+=1;
}
}
//建立環
void CreateLoop(Node *p)
{
Node *q=p;
while(q->next!=NULL)
q=q->next;
q->next=p;
}
//判斷是否有環
void containLoop(Node *p)
{
Node *q=p->next;
while(q!=p)
{
q=q->next;
if(q==NULL)
{
cout<<"無環"<<endl;
return;
}
}
cout<<"有環"<<endl;
}
//實現連結串列輸出
void showNode(Node *p)
{
while(p!=NULL)
{
cout<<p->value;
p=p->next;
}
}
int main()
{
Node *h=new Node;
int *a=new int[80];
h->next=NULL;
h->value=-1;
insertNode(h,0);
insertNode(h,1);
insertNode(h,2);
insertNode(h,3);
showNode(h);
cout<<endl;
//deleteNode(h,1);
//showNode(h);
/*updateKey(h,1,0);
showNode(h);
cout<<endl;
int index=SelectKey(h,0,a);
cout<<index<<endl;
cout<<a<<endl;
for(int i=0;i<index;i++)
{
cout<<a[i];
}
cout<<endl;*/
reverseList(h);
showNode(h);
cout<<endl;
containLoop(h);
//CreateLoop(h);
//containLoop(h);
cout<<findNodeFromBack(h,0);
return 0;
}
STL實現連結串列
#include <iostream>
using namespace std;
#include<list>
#include<algorithm>
void Print(int &item)
{
cout<<item<<" ";
}
int main()
{
list<int> listintegers;
//頭插法
listintegers.push_front(5);
listintegers.push_front(3);
listintegers.push_front(1);
for(list<int>::iterator it=listintegers.begin();it!=listintegers.end();it++)
{
cout<<"-"<<*it;
}
//尾插法
cout<<endl;
listintegers.push_back(6);
listintegers.push_back(7);
std::for_each(listintegers.begin(),listintegers.end(),Print);
cout<<endl;
//刪除某元素
listintegers.remove(3);
std::for_each(listintegers.begin(),listintegers.end(),Print);
cout<<endl;
//刪除尾元素
listintegers.pop_back();
std::for_each(listintegers.begin(),listintegers.end(),Print);
cout<<endl;
//刪除首元素
listintegers.pop_front();
std::for_each(listintegers.begin(),listintegers.end(),Print);
cout<<endl;
//查詢某元素
list<int>::iterator listinter;
int posi=0;
listinter=find(listintegers.begin(),listintegers.end(),5);
for( list<int>::iterator iter=listintegers.begin();iter!=listinter;iter++)
{
posi+=1;
}
cout<<posi<<endl;
if(listinter==listintegers.end())
cout<<"NO"<<endl;
else
{
cout<<"YES"<<endl;
}
//修改
for( list<int>::iterator iter=listintegers.begin();iter!=listintegers.end();iter++)
{
if(*iter==6)
*iter=7;
}
std::for_each(listintegers.begin(),listintegers.end(),Print);
return 0;
}