实验3:上机设计并验证线性表顺序表示的所有操作

本博文源于严蔚敏老师的书籍《数据结构》今天需要验证书籍中的单链表,我闲来无事直接帮他们实现了。

题目再现

1、现单链表的主要基本操作,并写一个主程序验证;
2、在单链表L的两个数据元素a和b间插入x,写出插入x的算法实现,并写程序进行验证

题目解题思想

  1. 题目1主要将书上的代码敲一遍就行了
  2. 第二题直接给出O(n)的遍历进行插入

题目1:

Status GetElem_L(LinkList L,int i,ElemType &e){
    
    
    LinkList  p = L->next;
    int j = 1;
    while(p && j<i){
    
    
        p = p->next;
        ++j;
    }
    if(!p || j>i) return ERROR;
    e = p->data;
    return OK;
}

Status ListInsert_L(LinkList &L,int i,ElemType e){
    
    
    LinkList  p = L;
    int j = 0;
    while(p && j<i-1){
    
    
        p = p->next;
        ++j;
    }
    if(!p || j>i-1) return ERROR;
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

Status ListDelete_L(LinkList &L,int i,ElemType &e){
    
    
    LinkList p = L;
    int j = 0;
    while(p->next && j<i-1){
    
    
        p = p->next ;
        ++j;
    }
    if(!(p->next)||j>i-1) return ERROR;
    LinkList q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}

void CreateList_L(LinkList&L,int n ){
    
    
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for(int i=n;i>0;i--){
    
    
        LinkList p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
}

题目2

Status LinkList_ab(LinkList&L,ElemType a,ElemType b,ElemType x){
    
    
    LinkList p = L;
    p = p->next;
    while(p){
    
    
        if(p->data == a) break;
        p = p->next;
    }
    LinkList q = p->next;
    if(p==NULL || q==NULL) return ERROR;
    else{
    
    
        LinkList tmp = (LinkList)malloc(sizeof(LNode));
        tmp->data = x;
        p->next = tmp;
        tmp->next = q;
    }
    return OK;


}

总结

没啥难度,直接按照书上编写就行了。

完整代码

#include<iostream>
#define ERROR -1
#define OK 1
using namespace std;
typedef int ElemType;
typedef int Status;
typedef struct LNode{
    
    
    ElemType data;
    struct LNode*next;
}LNode,*LinkList;

Status GetElem_L(LinkList L,int i,ElemType &e){
    
    
    LinkList  p = L->next;
    int j = 1;
    while(p && j<i){
    
    
        p = p->next;
        ++j;
    }
    if(!p || j>i) return ERROR;
    e = p->data;
    return OK;
}

Status ListInsert_L(LinkList &L,int i,ElemType e){
    
    
    LinkList  p = L;
    int j = 0;
    while(p && j<i-1){
    
    
        p = p->next;
        ++j;
    }
    if(!p || j>i-1) return ERROR;
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

Status ListDelete_L(LinkList &L,int i,ElemType &e){
    
    
    LinkList p = L;
    int j = 0;
    while(p->next && j<i-1){
    
    
        p = p->next ;
        ++j;
    }
    if(!(p->next)||j>i-1) return ERROR;
    LinkList q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}

void CreateList_L(LinkList&L,int n ){
    
    
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
    for(int i=n;i>0;i--){
    
    
        LinkList p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next = L->next;
        L->next = p;
    }
}
//在单链表L的两个数据元素a和b间插入x,写出插入x的算法实现
//假设相邻
Status LinkList_ab(LinkList&L,ElemType a,ElemType b,ElemType x){
    
    
    LinkList p = L;
    p = p->next;
    while(p){
    
    
        if(p->data == a) break;
        p = p->next;
    }
    LinkList q = p->next;
    if(p==NULL || q==NULL) return ERROR;
    else{
    
    
        LinkList tmp = (LinkList)malloc(sizeof(LNode));
        tmp->data = x;
        p->next = tmp;
        tmp->next = q;
    }
    return OK;


}
Status Print(LinkList L){
    
    
    if(L==NULL) return ERROR;
    LinkList p = L;
    p=p->next;
    while(p){
    
    
        cout << " " << p->data;
        p=p->next;
    }
    cout << endl;
}
int main(){
    
    
    LinkList L;
    cout << "test1:createList:" << endl;
    CreateList_L(L,5);
    Print(L);
    //Delete L

    //1 2 3 4 5
    int x;
    int flag = ListDelete_L(L,1,x);
    cout << "test2: deleted: "  << x << endl;
    Print(L);
    cout << "test3: geted:" ;
    GetElem_L(L,2,x);
    cout << x << endl;
    cout << "test4:ListInsert_L:5" << endl;
    ListInsert_L(L,2,5);
    Print(L);
    cout << "test5:insert [5,3] into 4"<< endl;
    LinkList_ab(L,5,3,4);
    Print(L);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_37149062/article/details/123184562