基于C++实现链表的(头插法/尾插法)创建链表/插入数据/删除数据

基于C++实现链表的(头插法/尾插法)创建链表/插入数据/删除数据

#include<malloc.h>
#include<iostream>
using namespace std;

class Data{
    public:
    Data *CreatList_h(); //头插法建立链表
    Data *CreatList_t(int n); //尾插法建立链表
    Data *InsertList(Data *L,int n); //向链表指定位置n插入元素
    Data *DeleteList(Data *L,int n); //删除链表中的指定值n
    void FindList(Data *L,int m); //查找链表中指定元素的位置
    void OutputList(Data *L); //输出链表的所有值
    //private: //不能为private :否则系统编译不通过,且报错,目前不清楚原因,欢迎留言;
    int n; //链表长度
    int data;
    Data *next;
};

int main(){
    Data L;
    int i=0;
    while(i != 7){
    cout << “***菜单****“ << endl;
    cout << “1.头插法建立链表\n2.尾插法建立链表\n3.向链表指定位置插入元素\n4.删除链表中的指定值\n5.查找链表中指定元素的位置\n6.输出链表的所有值\n7.退出\n请选择:” ;
    cin >> i;
    switch(i){
        case 1 :L = L->CreatList_h();break;
        case 2 : {
            int n=0;
            cout << “请输入链表数据个数:” << endl;
            cin >> n;
            L = L->CreatList_t(n);
        }; break; //尾插法建立链表
        case 3 : {
            int m = 0;
            cout<<”请输入要插入的位置:”;
            cin >> m;
            L = L->InsertList(L,m);
        }; break; //向链表指定位置插入元素
        case 4 :{
            int j = 0;
            cout<<”请输入想删除的数:”;
            cin>>j;
            L = L->DeleteList(L,j);
            }; break; //删除链表中的指定值
        case 5 :{
            int n = 0;
            cout << “请输入要查找位置的元素: “;
            cin >> n;
            L->FindList(L,n);
            };break; //查找链表中指定元素的位置
        case 6 : L->OutputList(L); break; //输出链表的所有值
        case 7 : cout << “退出” << endl ; break;
        }
        cout << endl;
    }
return 0;
}

Data *Data::CreatList_h(){ //头插法建立链表
    Data *L = new class Data[sizeof(class Data)];
    cout << “请输入链表数据个数:” << endl;
    cin >> L->n;
    L->next = NULL;
    for(int i = L->n ; i > 1; –i){
        Data *p = new class Data [sizeof(class Data)];
        cout << “请输入序号为”<< i <<”的数据:” ;
        cin >> p->data ;
        p->next = L->next; //L->next = NULL,确保尾节点为空值
        L->next = p; //链接,使上一个地址指向下一个元素位置
    }
    cout << “请输入序号为1的数据:” ;
    cin >> L->data ; //使 L->data有值,否则会出现为0且多一个数的情况;
    return L;
}

Data *Data::CreatList_t(int n){ //尾插法建立链表
    Data *q;
    Data *L = new class Data[sizeof(class Data)];
    q = L;
    L->next = NULL;
    cout << “请输入序号为1的数据:”; // 不进行该步骤会导致首元素为0
    cin >> L->data ; //使 L->data有值,否则会出现为0且多一个数的情况;
    for(int i = 2; i <= n ; i++){
        Data *p = new class Data [sizeof(class Data)];
        cout << “请输入序号为”<< i <<”的数据:” ;
        cin >> p->data ;
        q->next = p;
        q = p;
        p->ext = NULL;
    }
    return L;
}

Data *Data::InsertList(Data *L,int n){ //向链表指定位置n插入元素
    int j = 1,m;
    Data *p = L;
    cout << “请输入插入元素的值:” ;
    cin >> m;
    while( p && j < n-1){
        p = p->next;
        ++j;
    }
    if(!p || j > n-1) //i小于1或者大于表长+1
        return 0;
    Data *q = new class Data [sizeof(class Data)];
    q->data = m;
    q->next = p->next;
    p->next = q;
    return L; //一定要加这个,否则会吧n之前的数据全部扔掉,而不会返回;
}

Data *Data::DeleteList(Data *L,int n){ //删除链表中的指定值n
    int i=0;
    Data *p=L;
    Data *q;
    while(n != p->data){
        q = p;
        p = p->next;
    }
    q->next = p->next;
    cout << “已删除:” << n << endl;
    free(p);
    return L;
}

void Data::OutputList(Data L){
    int i=1;
    cout << “\n***“ << endl;
    while(L != NULL){
        cout << “序号:” << i << “数据:” << L->data << endl;
        L = L->next;
        i++;
    }
}

void Data::FindList(Data *L,int m){
    int i = 1;
    while(L != NULL){
        if( L->data == m)
            cout << “元素 “ << m << “的位置是 “ << i << endl;
        L = L->next;
    i++;
    }
}
除非特别说明,本博客所有作品均采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。转载请注明转自-https://www.emperinter.info/2018/09/29/%e5%9f%ba%e4%ba%8ec%e5%ae%9e%e7%8e%b0%e9%93%be%e8%a1%a8%e7%9a%84%e5%a4%b4%e6%8f%92%e6%b3%95-%e5%b0%be%e6%8f%92%e6%b3%95%e5%88%9b%e5%bb%ba%e9%93%be%e8%a1%a8-%e6%8f%92%e5%85%a5%e6%95%b0%e6%8d%ae/

Leave a Comment