前言

这部分代码还有一点地方不完善,没有考虑到操作链表中第一个元素的情况,有想法的可以自己修改,其实都差不多的。

代码

#define ElemType int
#define Status int
#define OK 0
#define OVERFLOW -1
#define ERROR -1
using namespace std;
#include<bits/stdc++.h>


//单链表的结构体定义 
typedef struct LNode{
    ElemType data;
    struct LNode *next;
    
}LNode,*LinkList; 



//初始化
Status InitList(LinkList &L) {
    L = new LNode;
    L->next = L; //指针域指向头节点 
    cout << "初始化成功!";
    return OK;
}

//链表的插入数据 
Status ListInsert(LinkList &L,int i,ElemType e) {
    
    LNode *p=L;
    for(int j =0;j<(i) && (p->next != L) ;j++){
        p=p->next;
    }
    if(p==L) return ERROR;
    LNode *s = new LNode;
    s->next=p->next;
    s->data=e;
    p->next=s;
    return OK;
}

//取第i项的值  通过e返回 
Status GetElem(LinkList L,int i,ElemType &e){
    LNode *p = L->next;
    for(int j =0;j<i && p->next!=L;j++){
        p = p->next;
    } 
    
    if(p==L) return ERROR;
    
    
    e = p->data;
    
    return OK;
} 


//返回的是目标元素的指针 按值查找 
LNode *LocateElem(LinkList L,ElemType e){
    LNode *p = L->next;
    while(p!=L && p->data!=e){
        p=p->next;
    }
    
    return p;
}





//展示数据 
void showData(LinkList L) {
    LNode *p = L->next;
    while(p!=L){
        cout << p->data;
        p=p->next;    
    }
    cout<<"\n";
}


// 删除数据 
Status ListDelete(LinkList &L,int i) {
    
    LinkList p, q;
    int j;
    p = L;
    j = 0;
    while ((p->next!=L) && (j < i)) //查找第i?1个结点,p指向该结点
    {
        p = p->next;
        ++j;
    }
    if ((p==L) || (j > i ))
        return ERROR; //当i>n或i<1时,删除位置不合理 
    q = p->next; //临时保存被删结点的地址以备释放 
    p->next = q->next; //改变删除结点前驱结点的指针域 
    delete q; //释放删除结点的空间 
    return OK;
}




 
//后插法 比如建立的链表为a b c d 那么输入顺序就是 a b c d 
Status CreateList_R(LinkList &L,int n) {
    L = new LNode;
    L->next =NULL;
    LNode *r = L; //中间变量指针,用于存储最后一个节点的地址位置  初始化创建的时候默认头节点的地址为尾指针的地址 
    for(int i = 0;i<n;i++){
        
        LNode *p = new LNode; //生成新节点 
        cin >> p->data; // 存入数据 
        p->next=L; //设置下一跳为空 
        r->next =p; //设置尾指针指向最后一个节点 
        r= p; // r的地址为p的地址   这里存储的是地址!!!!!!!!!! 
        /*
        
        C语言中指针间的等于号"="是把一个指针的地址赋予个另外一个指针!!! 
        
        */ 
    }
    
    
}


int main() {
    //初始化链表 
    int count = 5;
    LinkList list;
    CreateList_R(list,count);
    showData(list);
    
    
    //插入数据 
    cout << "在下标1插入9" << endl; 
    ListInsert(list,1,9) ;
    showData(list);
    //根据下标获取数据 
    cout << "获取下标为2的数据" << endl; 
    ElemType data = -1;
    GetElem(list,2,data);
    cout << data << endl;
    
    
    //根据元素值获取指针节点 
    cout << "获取元素1的指针" << endl; 
    LNode *dataNode = LocateElem(list,1) ;
    cout <<  dataNode->data << endl; 
    
    //根据下标删除数据
    cout << "删掉下标1的数据" << endl; 
    ListDelete(list,1) ;
    showData(list);
    
    
    return  0;
}

截图

Snipaste_2020-05-20_15-54-50.png

Last modification:May 20th, 2020 at 04:01 pm
如果觉得我的文章对你有用,请随意赞赏