鱼C论坛

 找回密码
 立即注册
查看: 1662|回复: 1

[技术交流] 顺序表

[复制链接]
发表于 2019-9-25 08:58:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
HEADER_H
#ifndef HEADER_H
#define HEADER_H// HEADER_H
# define Size   4
typedef struct Table
{
    int *head;
    int length;
    int size;
}table;
table  InitTable();
table addTable(table t ,int elem, int add);
table delTable(table t,int add);
table amendTable(table t,int elem,int newElem);
void displayTable(table t);
int selectTable(table t,int elem);
#endif

MAIN_C
#include <stdio.h>
#include <stdlib.h>
#include "header.h"


table  InitTable()
{
    table t;
    t.head=(int *)malloc(Size*sizeof(int));
    if(!t.head)
    {
        printf("初始化失败\n");
        exit(0);
    }
    t.length=0;
    t.size=Size;
    return t;
}
table addTable(table t ,int elem, int add)
{
    if(add>t.length+1 || add<1)
    {
        printf("插入的位置不正确\n");
        return t;
    }
    if(t.length>=t.size)
    {
        t.head=(int *)realloc(t.head,(t.size+1)*sizeof(int));
        if(!t.head)
        {
            printf("存储分配失败");
        }
        t.size+=1;
    }
    for(int i=t.length+1;i>=add-1;i--)
    {
        t.head[i+1]=t.head[i];
    }
    t.head[add-1]=elem;
    t.length++;
    return t;
}
table delTable(table t,int add)
{
    if(add>t.length ||add<1)
    {
        printf("被删除元素的位置有误");
        exit(0);
    }
    for(int i=add;i<t.length;i++)
    {
        t.head[i-1]=t.head[i];
    }
    t.length--;
    return t;
}
table amendTable(table t,int elem,int newElem)
{
    int add=selectTable(t,elem);
    t.head[add-1]=newElem;
    return t;
}
void displayTable(table t)
{
    for(int i=0;i<t.length;i++)
    {
        printf("%d",t.head[i]);
    }
    printf("\n");
}
int selectTable(table t,int elem)
{
    for(int i=0;i<t.length;i++)
    {
       if(t.head[i]==elem)
       {
           return i+1;
       }
    }return -1;
}

int main()
{
     table t1=InitTable();
     for(int i=1;i<Size;i++)
     {
         t1.head[i-1]=i;
         t1.length++;
     }
     printf("原顺序表\n");
     displayTable(t1);
     printf("删除元素t1\n");
     delTable(t1,1);
     displayTable(t1);

     printf("在2的位置插入元素5\n");
     t1=addTable(t1,5,2);
     displayTable(t1);

     printf("查找元素2的位置\n");
     int add=selectTable(t1,2);
     printf("%d\n",add);

     printf("将元素3改为6\n");
     t1=amendTable(t1,3,6);
     displayTable(t1);
    return 0;
}
改编来自Java修炼手册,一款安卓应用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-9-25 10:03:04 | 显示全部楼层
自己敲的MAIN_C
#include<stdio.h>
#include<stdlib.h>
#include "header.h"


table InitTable()
{
        table t;
        t.head=(int *)malloc(Size*sizeof(int));  //为数组分配一个确定的内存空间,大小为4个整形空间
        if(!t.head)
        {
                printf("初始化失败\n");   //若指针为空,则会输出屏幕
        }
        t.length=0;    //初始化对结构体中的参数进行初始设定
        t.size=Size;
        return t;
}
table addTable(table t,int add,int elem)
{
        if(add>t.length+1 ||add<1)  //如果添加的位置超过长度,报错  实际上length+1只到了length
        {
                printf("插入的位置有误\n");
            return t;
        }
    if(t.length>=t.size)
    {
            t.head=(int *)realloc(t.head,(t.size+1)*sizeof(int));
            if(!t.head)
        {
            printf("存储分配失败\n");
        }
    }
    /*for(int i=0;i<t.length+1;i++)
    {
        printf("%d-----",t.head[i]);
    }
     printf("\n");*/
    //printf("%d",t.length);
    for(int i=t.length;i>=add-1;i--)//从length开始计。length这个变量最多可以到4,在不扩容的情况下。
             //此时length未加1。而此时扩容了。length+1不会溢出
    {
            t.head[i+1]=t.head[i];
        //printf("%d---",t.head[i]);
    }
    t.head[add-1]=elem;
    t.length++;
    return t;
}
table delTable(table t,int add)
{
    if(add<1 ||add >t.length+1)
    {
            printf("你删除的位置有误\n");
    }
    for(int i=add;i<t.length+1;i++)
    {
            t.head[i-1]=t.head[i];   //将删除位置的覆盖
    }
    t.length--;
    return t;
}
int   selectTable(table t,int  elem)
{
    int BOOL=0;
        if(!t.head)
        {
                printf("数据有误\n");
        }
        int i;
        for( i=0;i<t.size;i++)
        {
                if(t.head[i]==elem)
                {
                    BOOL=1;
                        return i+1;
                        ;//根据实际情况来看,我们是从1开始计数,而不是0;
                }
        }
        if(!BOOL)
    {
        printf("无此数据,请检查是否输入有误");
    }
        return -1;
}
table amendTable(table t,int elem,int newElem)
{
        if(!t.head)
        {
                printf("数据有误\n");
        }
        int add=selectTable(t,elem);
        t.head[add-1]=newElem;
        return t;
}

table disPlay(table t)
{
        if(!t.head)
        {
                printf("数据有误\n");
        }
    for(int i=0;i<t.length;i++)
    {
            printf("%d",t.head[i]);
    }
    printf("\n");
    return t;
}
int main()
{
    table t1=InitTable();
    disPlay(t1);
    for(int i=0;i<Size;i++)
    {
        t1.head[i]=i;
        t1.length++;
    }
    printf("创建表t1\n");
    disPlay(t1);
    printf("在2之前增加元素5\n");
    printf("查找元素2的位置\n");
    int add=selectTable(t1,2);
    addTable(t1,add,5);
    disPlay(t1);
    delTable(t1,3);
    disPlay(t1);
    amendTable(t1,2,6);
    disPlay(t1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 11:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表