• 线性表的顺序与链式表示


    本文作者:韩申权
    作者博客:http://www.cnblogs.com/hsqdboke
    转载请注明出处,侵权必究,保留最终解释权!

    分别建立包含10个数据元素的顺序线性表和链式线性表;

    从键盘输入一个数据元素和插入位置k,将元素插入到线性表中第k(包含0号位置)个位置;

    从键盘输入一个数据元素关键字或位置k(包含1号位置),从线性表中删除相应数据元素;

    能完成查找功能;

    给出程序及插入、删除前和插入、删除后线性表结果。

    顺序表示:

    //顺序表示
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #define TURE 1
    #define FAUSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define LIST_INIT_SIZE 10
    #define LISTINCREMENT 4
    typedef int Status;
    typedef int ElemType;
    typedef struct
    {
        ElemType *elem;
        int length;
        int listsize;
    }SqList;
    
    Status InitList_Sq(SqList *L) //初始化线性表
    {
        L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
        if(!L->elem)return OVERFLOW;
        L->length=0;
        L->listsize =LIST_INIT_SIZE;
        return OK;
    }
    
    Status ListInsert_Sq(SqList *L,int i,ElemType e)//向表中插入元素
    {
        ElemType *q,*p,*newbase;
        if(i<1||i>L->length+1)
            return ERROR;
        if(L->length>=L->listsize)//若当前表长>=计划表长则开辟新空间
        {
            newbase=(ElemType *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(ElemType));
            if(!newbase)return ERROR;
            L->elem=newbase;
            L->listsize+=LISTINCREMENT;
    
        }
    
        q=&(L->elem[i-1]);
        for(p=&(L->elem[L->length-1]);p>=q;p--)*(p+1)=*p;
           *q=e;
           ++L->length;
    
           return OK;
    }
    
     Status ListDelete_Sq(SqList *L,int i,ElemType *e)//删除表中的元素
     {
         ElemType *p,*q;
         if(i<1||i>L->length+1)return ERROR;
         p=&(L->elem[i-1]);
         *e=*p;
         q=(L->elem+L->length-1);
         for(++p;p<=q;p++)*(p-1)=*p;
         --L->length;
        return OK;
     }
    int ListFind(SqList L,int k)
     {
         return L.elem[k-1];
     }
    int main()
    {
        SqList Lst;
        int i,j,n=10,a,k,p=1;
        ElemType e;
        if(InitList_Sq(&Lst)==OK)
        {
            for(i=1;i<=n;i++)
                if(ListInsert_Sq(&Lst,i,i)!=OK)break;
                printf("原来线性表中的元素为:");
                for(i=0;i<Lst.length;i++)
                    printf("%d ",Lst.elem[i]);
                    printf("\n");
                while(p)
                {
                    printf("1)插入元素2)删除元素3)查找元素4)显示操作结果0)退出\n");
                    scanf("%d",&j);                
                    switch(j)
                    {
                        case 1:
                    printf("请输入要插入的元素和插入的位置:");
                    scanf("%d%d",&a,&k);
                    ListInsert_Sq(&Lst,k,a);break;
                        case 2:
                        printf("请输入要删除的元素和删除的位置:");
                    scanf("%d",&k);
                    ListDelete_Sq(&Lst,k,&e);break;
                        case 3:
                        printf("请输入查找元素的位置:");
                        scanf("%d",&k);                    
                        printf("位置为%d的元素为%d\n",k,ListFind(Lst,k));
                        case 4:
                    for(i=0;i<Lst.length;i++)
                        printf("%d ",Lst.elem[i]);
                        printf("\n");break;
                        case 0:p=0;break;
                    }
                }
                
        }//if
        return 0;
    }//main

    链式表示:

    #include<stdio.h>//带头结点的链表操作
    #include<stdlib.h>
    #define ERROR 0
    #define OK 1
    #define OVERFLOW -1
    typedef int ElemType;
    typedef struct LNode
    {
        ElemType data;
        struct LNode *next;
    }LNode,*LinkList;
    void GetElem(LinkList L,int i,ElemType *e)//查找第i个元素并返回
    {    
        LNode *p;
        int j=1;
        p=L->next;
        while(p&&j<i)
        {
            p=p->next;++j;
        }
        if(!p||j>i)printf("不存在,查找错误\n");
        else
        *e=p->data;    
    }
    void ListInsert_L(LinkList *L,int i,ElemType e)//插入元素
    {
        LinkList p=*L,s=NULL;
        int j=0;
        while(p&&j<i-1){p=p->next;++j;}
        if(!p||j>i-1)printf("插入位置错误\n");    
        s=(LinkList)malloc(sizeof(LNode));
        s->data=e;
        s->next=p->next;
        p->next=s;
    }
    void ListDelet_L(LinkList *L,int i,ElemType *e)//删除元素
    {
        LNode *p=*L,*q=NULL;
        int j=0;
        while(p->next&&j<i-1)
        {
            p=p->next;++j;
        }
        if(!(p->next)||j>i-1)printf("删除位置错误");
        q=p->next;p->next=q->next;
        *e=q->data;
        free(q);    
    }
    void CreatList(LinkList *L,int n)//建立链表 输入n个ElemType类型的数
    {
        LinkList p=NULL,q=NULL;
        int i;
        ElemType m;
        (*L)=(LinkList)malloc(sizeof(LNode));
        (*L)->next=NULL;
        p=(LinkList)malloc(sizeof(LNode));
        p->next=NULL;
        q=p;
        scanf("%d",&m);
        p->data=m;
        (*L)->next=p;
        for(i=1;i<n;i++)
        {
            p=(LinkList)malloc(sizeof(LNode));        
            scanf("%d",&m);
            p->data=m;
            q->next=p;
            p->next=NULL;
            q=p;
        }
    }
    void DisList(LinkList L)
    {
        LinkList p=L->next;    
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    int main()
    {
        LinkList L=NULL;
        int i,p=1,m;
        ElemType e;
        printf("请输入10个元素:\n");
        CreatList(&L,10);
        printf("原来的10个元素为:");
        DisList(L);
        while(p)
        {
            printf("1)插入2)删除3)查找4)显示操作结果0)退出\n");
            scanf("%d",&m);
            switch(m)
            {
            case 1:printf("请分别输入要插入元素的位置及与元素值: ");
                scanf("%d%d",&i,&e);ListInsert_L(&L,i,e);break;
            case 2:printf("请分别输入要删除元素的位置: ");
                scanf("%d",&i);ListDelet_L(&L,i,&e);printf("删除的元素值为:%d\n",e);break;
            case 3:printf("请分别输入要查找的元素的位置: ");
                scanf("%d",&i);GetElem(L,i,&e);printf("该位置的元素为:%d\n",e);break;
            case 4:DisList(L);break;
            case 0:p=0;break;
            }
        }
    
        return 0;
    }

  • 相关阅读:
    html5 localstorage本地存储
    如何在源码里修改openwrt root密码
    openwrt-scripts/config/mconf: Syntax error: “(” unexpected错误解决
    HTML5获取地理位置信息
    Mysql 查看连接数,状态 最大并发数(赞)
    晨读笔记:CSS3选择器之属性选择器
    CSS3选择器之属性选择器
    js判断浏览器类型
    javascript json字符串与对象相互转换
    手机端html5触屏事件(touch事件)
  • 原文地址:https://www.cnblogs.com/hsqdboke/p/2510757.html
Copyright © 2020-2023  润新知