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;
            }
        }
    }
  • 相关阅读:
    ant实践总结
    Ubuntu安装JDK和Eclipse
    Xp下安装Ubuntu
    [Hadoop] 传智播客新版Hadoop视频教程 段海涛老师Hadoop八天完全攻克Hadoop视频教程 Hadoop开发
    Ctypes简单应用以及PyQt5等简单使用过程中遇到的部分问题
    python初探:关于闭包
    利用Nginx+Frp搭建HTTP正向代理
    C#发送邮件时提示:“不允许使用邮箱名称。服务器响应为:”的错误解决办法
    提倡IT从业人员终身学习
    打算在博客园安家了
  • 原文地址:https://www.cnblogs.com/double891/p/9128754.html
Copyright © 2011-2022 走看看