zoukankan      html  css  js  c++  java
  • 线性表的基本操作

    1.线性表的顺序表示和实现(顺序表):

    #include<stdio.h>
    
    #define MaxSize 100
    
    typedef int DataType;
    typedef struct //定义结构体Seqlist
    {
        DataType list[MaxSize];
        int size;
    } SeqList;
    //初始化顺序表L
    void ListInitiate(SeqList *L)
    {
        L->size=0; //定义初始数据元素个数
    }
    
    int ListLength(SeqList L) //当前数据元素个数
    {
        return L.size;
    }
    
    int ListInsert(SeqList *L,int i,DataType x)
    {
        int j;
    
        if(L->size>=MaxSize)
        {
            printf("顺序表已满无法插入!
    ");
            return 0;
        }
        else if(i<0||i>L->size)
        {
            printf("i is error");
            return 0;
        }
        else
        {
            for(j=L->size; j>i-1; j--) L->list[j]=L->list[j-1];
                    
            L->list[i-1]=x;
            L->size++;
    
            return 0;
        }
    }
    //删除数据元素
    int ListDelete(SeqList *L,int i)
    {
        int j;
    
        if(L->size<=0)
        {
            printf("顺序表已无数据元素可删!
    ");
            return 0;
        }
        else if(i<0||i>L->size-1)
        {
            printf("i is error
    ");
            return 0;
        }
        else
        {
            for(j=i; j<=L->size-1; j++) L->list[j-1]=L->list[j];
                    
            L->size--;
            return 0;
        }
    }
    //查找数据元素
    int ListSearch(SeqList L,DataType x)
    {
        int i;
    
        for (i=0; i<L.size; i++)
        {
            if(L.list[i]==x)
            {
                printf("找到,%d在第%d个位置
    ",x,i+1);
                return 0;
            }        
            
        }
        printf("没有找到%d
    ",x);    
        
        return 0;    
    }
    
    int main()
    {
        SeqList La,Lb,Lc;
        int i,x;
        int n,m;//线性表长度    
        
        ListInitiate(&La);
    
        printf("请输入线性表La的长度:
    ");
        scanf ("%d",&n);
    
        La.size=n;
        printf("请输入线性表La中的元素:
    ");
        for(i=0; i<n; i++)
            scanf ("%d",&La.list[i]);
            
        printf("请输入要插入到线性表La中的数字x和插入的位置i:
    ");
        scanf("%d%d",&x,&i);
    
        ListInsert(&La,i,x);
    
        printf("线性表La=");
        for(i=0; i<La.size; i++)
            printf("%d ",La.list[i]);
            
        printf("
    请输入要删除的数字的位置:
    ");
        scanf("%d",&i);
    
        ListDelete(&La,i) ;
    
        printf("线性表La=
    ");
        for(i=0; i<La.size; i++)
            printf("%d ",La.list[i]);    
        
        printf("
    请输入要查找的数字:
    ");
        scanf("%d",&x);
        ListSearch(La,x);
    
        return 0;
    }

    2.线性表的链式表示和实现(单链表):

    # include <iostream>
    # include <cstdio>
    # include <algorithm>
    # include <queue>
    # include <cmath>
    # include <cctype>
    # include <cstring>       //sizeof(x)--计算变量x的长度
    # include <cstdlib>       //mallioc(m)--开辟m字节长度的地址空间,并返回这段空间的首地址
    # define ERROR 0          //free(p)--释放指针p所指变量的存储空间,即彻底删除一个变量
    # define OK    1
    typedef int Status;
    using namespace std;
    
    typedef struct Lnode
    {
        int data;//数据域:元素本身信息
        struct Lnode *next;//指针域:指示直接后继的存储位置
    } Lnode, *LinkList; //*LinkList为指向Lnode类型的指针类型
    
    int m = sizeof(Lnode);//Lnode变量长度
    
    /*LinkList CreateList(int n)//每次将新插入的结点作为首元结点
    {
        LinkList s, L;
        L = (LinkList)malloc(m);//为结点分配内存空间(开辟头指针)
        L->next = NULL;
        while(n--)
        {
            s = (LinkList)malloc(m);//为每个元素开辟存储空间
            cin >> s->data;//将数据存到结点中(将数据存到s的数据域中)
            s->next = L->next;//将链表的首元结点作为新结点的后继
            L->next = s;//将当前结点作为头结点的后继
        }
        return L;
    }*/
    LinkList CreateListRear(int n)//每次将新插入的结点作为表尾结点
    {
        LinkList L, s, rear;
        L = rear = (LinkList)malloc(m);
        L->next = NULL;
        while(n--)
        {
            s = (LinkList)malloc(m);//为每个元素开辟存储空间
            cin >> s->data;//将数据存到结点中(将数据存到s的数据域中)
            rear->next = s;//将新节点s作为rear的后继;
            rear = s;//让rear指向新的表尾结点s;
        }
        rear->next = NULL;
        return L;
    }
    void TraverseList(LinkList L)//遍历单链表
    {
        LinkList p = L->next;//声明一个指针p指向首元结点
        while(p)
        {
            cout << p->data << " ";//输出当前元素p->data
            p = p->next;//指针p指向下一个元素
        }
        cout << endl;
    }
    /*Status ListInsert(LinkList L, int i, int e)//单链表的插入
    {
        int j = 1;
        LinkList p, s, s1;
        p = L;
        s = L->next;
        while(s && j < i)
        {
            p = s;
            s = s->next;
            j++;
        }
        if((s == NULL && j < i) || i < 1)
            return ERROR;
        s1 = (LinkList)malloc(m);
        s1->data = e;
        s1->next = p->next;
        p->next = s1;
        return OK;
    }*/
    /*Status ListDel(LinkList L, int i)//单链表的删除
    {
        LinkList p = L, s = L->next;
        int j = 1;
        while(s && j < i)
        {
            p = s;
            s = s->next;
            j++;
        }
        if((s == NULL && j < i) || i < 1)
            return ERROR;
        p->next = s->next;
        free(s);
        return OK;
    }*/
    int main()
    {
        int n;
        LinkList L;
        cin >> n;
        //L = CreateList(n);
        L = CreateListRear(n);
        //int k;
        //cin >> k;//k表示要删除的位置
        //ListDel(L, k);
        //int x, y;//x表示要插入的位置,y表示要插入的数
        //cin >> x >> y;
        //ListInsert(L, x, y);
        TraverseList(L);
        return 0;
    }
  • 相关阅读:
    gcc编译器遇到的部分问题的总结(二)
    gcc编译器遇到的部分问题的总结
    Illegal instruction与march编译选项
    使用using与typedef来定义别名
    C++模板学习之递归
    C++模板学习之typename
    简单的listen+fork accept服务器实现
    一个简单的日志类的开发
    linux中的select和epoll模型
    程序异常退出调试(二)
  • 原文地址:https://www.cnblogs.com/syhandll/p/4838424.html
Copyright © 2011-2022 走看看