1. 程式人生 > >從今天開始學習資料結構(c++/c)---連結串列

從今天開始學習資料結構(c++/c)---連結串列

先實現這麼多功能,後續再填程式碼(本人一菜渣,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;
}