鏈表數據結構(C/C++語言實現)


注意:沒有使用malloc和free;加了一個頭文件,用於清屏和暫停;還有就是一個錯誤特別容易被忽略,那就是主函數中聲明了LinkList p,然后就直接創建鏈表,忘了給p分配空間。一定要先初始化鏈表再建立。以下代碼說白了就是一個個的函數堆出來的,只是要注意函數的參數有時候有引用符&,有時候沒有,我總結了一個便於記憶的小技巧:如果你想要對鏈表做出任何改變,請一定加上&;如果你對鏈表不想做出改變,就可以不用加,無論你加還是不加,為了保險,可以都加上。如果擅長用指針的話,就忽略從此段話!!!!!

#include<iostream>
#include<cstdlib>
using namespace std;

struct LNode{
    int data;
    LNode* next;
};
typedef LNode *LinkList;

//函數聲明
void show();
void InitList(LinkList &L);
int CreateList(LinkList &L,int n);
int InsertList(LinkList &L,int index,int e);
string GetElem(LinkList L,int index,int &e);
int deleteList(LinkList &L,int index,int &e);
void PrintList(LinkList L);

int main(){
    int action,length,index,result,e;
    string res;
    LinkList L;
    show();
    while(cin>>action){
        switch(action){

            case 1://初始化鏈表
                system("cls");
                InitList(L);
                break;

            case 2://建立鏈表
                system("cls");
                cout<<"請輸入鏈表的長度:"<<endl;
                cin>>length;
                result=CreateList(L,length);
                if(!result){
                    cout<<"創建鏈表失敗!"<<endl;
                } else {
                    cout<<"創建鏈表成功!"<<endl;
                }
                break;

            case 3://向鏈表中插入數據
                system("cls");
                cout<<"請輸入想要插入的位置和插入元素的值:"<<endl;
                cin>>index>>e;
                InsertList(L,index,e);
                break;

            case 4://獲取索引為index的元素值
                system("cls");
                cout<<"請輸入索引:"<<endl;
                cin>>index;
                res=GetElem(L,index,e);
                if(res=="yes"){
                    cout<<"第"<<index<<"個數是"<<e<<endl;
                } else {
                    cout<<"未找到該索引的值"<<endl;
                }
                break;

            case 5://刪除索引為index的值
                system("cls");
                cout<<"請輸入想要刪除的數的索引:"<<endl;
                cin>>index;
                deleteList(L,index,e);
                cout<<"第"<<index<<"個元素已經被刪除!"<<endl;
                break;

            case 6://打印鏈表
                system("cls");
                cout<<"鏈表內容為:"<<endl;
                PrintList(L);
                break;

            case 7://退出
                return 0;
        }
        system("pause");//暫停
        system("cls");//清屏
        show();
    }
}

//主界面
void show(){
    cout<<"+----------------------------------------+"<<endl;
    cout<<"|                                        |"<<endl;
    cout<<"|            1->初始化鏈表               |"<<endl;
    cout<<"|            2->創建鏈表                 |"<<endl;
    cout<<"|            3->插入結點                 |"<<endl;
    cout<<"|            4->查找結點                 |"<<endl;
    cout<<"|            5->刪除節點                 |"<<endl;
    cout<<"|            6->打印鏈表                 |"<<endl;
    cout<<"|            7->退出                     |"<<endl;
    cout<<"|                                        |"<<endl;
    cout<<"+----------------------------------------+"<<endl;
}

//初始化鏈表
void InitList(LinkList &L){
    L=new LNode;
    cout<<"鏈表初始化成功!"<<endl;
}

//創建鏈表
//尾插法,最先進入的元素在最末尾
//int CreateList(LinkList &L,int n){
//    cout<<"請依次輸入結點的值:"<<endl;
//    L->next=NULL;
//    int i;
//    for(i=0;i<n;i++){
//        LinkList p=new LNode;
//        cin>>p->data;
//        p->next=L->next;
//        L->next=p;
//    }
//    if(i!=n){
//        return 0;//失敗
//    } else {
//        return 1;//成功
//    }
//}

//正序創建,按照輸入順序存儲
int CreateList(LinkList &L,int length){
    cout<<"請依次輸入結點的值:"<<endl;
    LinkList p,q;
    L->next=NULL;
    p=L;
    for(int i=0,x;i<length;i++){
        LinkList q=new LNode;
        cin>>x;
        q->data=x;
        p->next=q;
        p=p->next;
    }
    p->next=NULL;
    return 1;
}



//獲取第i個結點的值
string GetElem(LinkList L,int i,int &e){
    LinkList p;
    p=L->next;
    int j=1;
    while(p&&j<i){
        p=p->next;
        j++;
    }
    if(!p||j>i){
        return "no";//未找到
    }  else {
        e=p->data;
        return "yes";//找到
    }
}

//將值為e的結點插入到第i個位置
int InsertList(LinkList &L,int i,int e){
    LinkList p;
    p=L;
    int j=0;
    while(p&&j<i-1){
        p=p->next;
        j++;
    }
    if(!p||j>i-1){
        return 0;   //失敗
    } else {
        LinkList s=new LNode;
        s->data=e;
        s->next=p->next;
        p->next=s;
        return 1;//成功
    }
}

//刪除第i個結點,並將結點的值保存到e中
int deleteList(LinkList &L,int i,int &e){
    LinkList p,q;
    p=L;
    int j=0;
    while(p->next&&j<i-1){
       p=p->next;
       j++;
    }
    if(!(p->next)&&j>i-1){
        return 0;
    }
    q=p->next;
    p->next=q->next;
    e=q->data;
    delete q;//釋放q結點,節約空間
    return e;
}

//打印鏈表
void PrintList(LinkList L){
    LinkList p;
    p=L;
    while(p->next){
        p=p->next;
        cout<<p->data<<" ";
    }
    cout<<endl;
}

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM