zoukankan      html  css  js  c++  java
  • 考研数据结构-单链表(基本操作)

    这次和以往不同,我们先放出全部代码,之后再慢慢分析。

    #include<stdio.h>
    #include<malloc.h>
    #define ElemType int
    
    
    
    typedef struct LNode{
        struct LNode *next;
        ElemType data;
    }LNode,*LinkList;
    
    
    LinkList  CreateLinkListH1(LinkList &L){
    //头插法 ,data域来源于键盘输入 
        LNode *s;
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        scanf("%d",&x);
        while(x!=9999){
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            s->next=L->next;
            L->next=s;
            scanf("%d",&x);
        }
        return L;
    }
    
    LinkList  CreateLinkListH2(LinkList &L,int a[],int n){
    //头插法 ,data域来源于数组 
        LNode *s;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        for(int i=0;i<n;i++){
            s=(LNode*)malloc(sizeof(LNode));
            s->data=a[i];
            s->next=L->next;
            L->next=s;
        }
        return L;
    }
    
    
    
    
    LinkList CreateLinkListR1(LinkList &L){
    //尾插法 ,data域来源于键盘输入 
        LNode *s,*r;
        int x;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        r=L;
        scanf("%d",&x);
        while(x!=9999){
            s=(LNode*)malloc(sizeof(LNode));
            s->data=x;
            r->next=s;
            r=s;
            scanf("%d",&x);
        }
        r->next=NULL;
        return L;
    } 
    
    LinkList CreateLinkListR2(LinkList &L,int a[],int n){
    //尾插法 ,data域来源于数组 
        LNode *s,*r;
        L=(LinkList)malloc(sizeof(LNode));
        L->next=NULL;
        r=L;
        for(int i=0;i<n;i++){
            s=(LNode*)malloc(sizeof(LNode));
            s->data=a[i];
            r->next=s;
            r=s;
        }
        r->next=NULL;
        return L;
    } 
    
    void LoadLinkList(LinkList L){
        LNode *p;
        p=L->next;
        if(p==NULL)printf("当前链表为空");
        printf("当前链表元素有:") ;
        while(p!=NULL){
            printf("%d ",p->data);
            p=p->next;
        }
        printf("
    ");
    }
    
    LNode *GetElem(LinkList L,int i){
    //按序号查找第i个结点值 
        int j=1;
        LNode *p;
        p=L->next;
        if(i==0)return L;     //若i==0,则返回头结点 
        if(i<1)return NULL;   //若i无效, 则返回NULL 
        while(j<i&&p){
            p=p->next;
            j++;
        }
        return p;          //返回第i个节点的指针,如果i>表长,p==NULL,也是直接返回p即可。 
    }
    
    
    LNode *LocateElem(LinkList L,int x){
    //按值查找表结点 
        LNode *p;
        p=L->next;
        while(p!=NULL&&p->data!=x){
            p=p->next;
        }
        return p;
    } 
    
    void LinkListInsertR1(LinkList &L,int i,ElemType e){
    //后插操作 ,在给定位置之后插入 
        LNode *p;
        p=GetElem(L,i);         //本算法主要的时间开销在于查找第i-1个元素,时间复杂度为O(n) 
        LNode *s;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
    } 
    void LinkListInsertR2(LinkList &L,LNode *p,ElemType e){
    //在给定结点之后插入,时间复杂度仅为O(1) 
         LNode *s;           
        s=(LNode*)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s; 
    } 
    
    void LinkListInsertH1(LinkList &L,int i,ElemType e){
    //前插用后插实现 ,在给定位置之前插入 
        LNode *p;
        p=GetElem(L,i-1);         //本算法主要的时间开销在于查找第i-1个元素,时间复杂度为O(n) 
        LNode *s;
        s=(LNode*)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
    } 
    
    void LinkListInsertH2(LinkList &L,LNode *p,ElemType e){
    //前插用后插操作实现,在给定结点之前插入,时间复杂度仅为O(1) 
         LNode *s;     
        ElemType temp;      
        s=(LNode*)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s; 
        temp=s->data;
        s->data=p->data;
        p->data=temp;
    } 
    
    void LinkListDelete1(LinkList &L,int i,ElemType &e){
    //删除指定位置的结点 
        LNode *p;
        p=GetElem(L,i-1);
        LNode *q=p->next;
        e=q->data;
        p->next=q->next;
        free(q);
    } 
    
    void LinkListDelete2(LinkList &L,LNode *p,ElemType &e){
    //删除指定结点p 可以通过删除p的后继结点实现,就是先将p的后继节点的值赋给自身,然后删除p的后继节点 
        ElemType temp;
        e=p->data;
        LNode *q;
        q=p->next;
        p->data=q->data;
        p->next=q->next;
        free(q);
    } 
    
    int GetLength(LinkList L){
        int len=0;
        LNode *p=L->next;
        if(p==NULL)return 0;
        while(p){
            len++;
            p=p->next;
        }
        return len;
    }
    
    
    int main(){
        LinkList L1,L2;
        int a,i,x; 
        LNode *p,*q; 
    //    int array[10]={3,4,6,8,44,2,4,5,6,66}; 
    //    printf("头插法建立链表L1
    ");  //CreateLinkListH
    //    CreateLinkListH1(L1);
    //    LoadLinkList(L1);
    //    CreateLinkListH2(L1,array,10);
    //    LoadLinkList(L1);
    //    CreateLinkListR2(L1,array,10);
    //    LoadLinkList(L1);
        printf("尾插法建立链表L2
    ");   //CreateLinkListR
        CreateLinkListR1(L2);
        LoadLinkList(L2);
        while(1){
            printf("1:计算表长
    ");  //GetLength 
            printf("2:指定结点的元素值
    ");  //GetElem
            printf("3:按结点位置插入结点
    ");
            printf("4:按结点元素插入结点
    ");     
            printf("5:按结点位置删除结点
    ");
            printf("6:按结点元素删除结点
    "); 
            scanf("%d",&a); 
            switch(a){
                case 1: printf("L1表长为:%d
    ",GetLength(L1));
                        printf("L2表长为:%d
    ",GetLength(L2));    
                        break;
                case 2: printf("请输入结点位置:");
                        scanf("%d",&i);
                        p=GetElem(L2,i);
                        printf("%d
    ",p->data);
                        break;
                case 3: printf("[前插]请输入插入结点位置及元素值");
                        scanf("%d %d",&i,&x);
                        LinkListInsertH1(L2,i,x);
                        LoadLinkList(L2);
                        printf("[后插]请输入插入结点位置及元素值");
                        scanf("%d %d",&i,&x);
                        LinkListInsertR1(L2,i,x);
                        LoadLinkList(L2);
                        break; 
                case 4: printf("[前插]请输入要在哪个元素前插入什么元素值"); 
                        scanf("%d %d",&i,&x);
                        q=LocateElem(L2,i);
                        LinkListInsertH2(L2,q,x);
                        LoadLinkList(L2);
                        printf("[后插]请输入要在哪个元素后插入什么元素值");
                        scanf("%d %d",&i,&x); 
                        q=LocateElem(L2,i);
                        LinkListInsertR2(L2,q,x);
                        LoadLinkList(L2);
                        break;
                case 5: printf("请输入删除结点位置");
                        scanf("%d",&i);
                        LinkListDelete1(L2,i,x);
                        LoadLinkList(L2);
                        break;
                case 6: printf("请输入要删除的元素值");
                        scanf("%d",&i); 
                        q=LocateElem(L2,i);
                        LinkListDelete2(L2,q,x);
                        LoadLinkList(L2);
                        break;
                default:return 1;
            }
        }
    }
  • 相关阅读:
    网站性能之meta标签
    布局中的css要素
    MVC中配置OutputCache的VaryByParam参数无效的问题
    C# 4.0 类与继承
    想要充值手机话费吗???亿矿网找错误送话费啦
    .Net Core 依赖注入
    Hadoop实战内容摘记
    Thead,TheadPool,Task,async,await 的前世今生
    VS Code 中 使用 Git版本控制工具
    dotnet 命令大全-理论版
  • 原文地址:https://www.cnblogs.com/double891/p/9128754.html
Copyright © 2011-2022 走看看