鱼C论坛

 找回密码
 立即注册
楼主: 小甲鱼

[技术交流] 静态顺序表的各种操作(线性表)

  [复制链接]
发表于 2015-5-10 12:05:01 | 显示全部楼层
给力,嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-10 13:18:47 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-10 15:25:14 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-10 19:16:40 | 显示全部楼层
辛苦了, 小甲鱼:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-10 21:23:31 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-12 10:27:21 | 显示全部楼层
真是难得给力的帖子啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-19 12:39:32 | 显示全部楼层
谢谢小甲鱼了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-5-31 00:02:34 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-3 15:58:49 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-6 20:41:38 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-9 17:17:31 | 显示全部楼层
小甲鱼棒棒哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-12 10:17:17 | 显示全部楼层
我会加油学会的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-15 14:00:01 | 显示全部楼层
不错,学习了,顶楼主!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-17 10:30:42 | 显示全部楼层
谢谢小甲鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-21 15:19:16 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-22 10:22:47 | 显示全部楼层
谢谢楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-22 15:32:41 | 显示全部楼层
本帖最后由 seii 于 2015-6-22 15:36 编辑
/*****************************/
/** By Seii  **/
/*****************************/
#ifndef _LIST_H_
#define _LIST_H_
#include <stdio.h>
#include <stdlib.h>

typedef enum{
        false, true
}bool;

typedef enum{
        ERROR, OK
}status;

typedef int ElemType;
typedef int CursorType;
#define MAXSIZE 10

typedef struct _list{
        ElemType data;
        CursorType cur;
}Component, SLList[MAXSIZE];

#define _IsEmpty(SSLptr) ((SSLptr)[MAXSIZE-1].cur==0)
#define _IsFull(SSLptr) ((SSLptr[0].cur==0))

status InitSLL(SLList list);//初始化
void PrintSLL(const SLList list);//打印
status InsertBackSLL(SLList list, ElemType data);//尾部插入数据
void MoveToLast(SLList list, CursorType *lastCur);//移动到最后一个元素
status InsertFrontSLL(SLList list, ElemType data);//头部插入数据
size_t GetRestSpace(const SLList list);//获取剩余的存储空间
status MoveToPrevPos(const SLList list, int pos, CursorType *target);//移动到pos处的前一个元素
status InsertByPos(SLList list, int pos, ElemType data);//根据位置插入数据
status RemoveByPos(SLList list, int pos);//根据位置删除元素

#endif //_LIST_H_
#include "list.h"

status InitSLL(SLList list){//初始化
        if (list == NULL)return ERROR;
        for (int i = 0; i < MAXSIZE - 1; i++){
                list[i].cur = i + 1;
                list[i].data = 0;
        }
        list[MAXSIZE - 1].data = 0;
        list[MAXSIZE - 1].cur = 0;
        list[MAXSIZE - 2].cur = 0;
        return OK;
}

void PrintSLL(const SLList list){//打印
        if (list == NULL)
                puts("***********************该链表无效********************\n");
        else if (_IsEmpty(list))
                puts("***********************该链表为空********************\n");
        else{
                puts("***********************链表数据START********************");
                for (CursorType i = list[MAXSIZE - 1].cur; i != 0; i = list[i].cur){
                        printf("%d  ", list[i].data);
                }
                putchar('\n');
                puts("***********************链表数据E N D********************\n");
        }
}

status InsertBackSLL(SLList list, ElemType data){//尾部插入数据
        if (list == NULL)return ERROR;
        CursorType last;
        if (_IsEmpty(list))
                list[MAXSIZE - 1].cur = 1;
        MoveToLast(list, &last);
        list[last].cur = list[0].cur;
        list[0].cur = list[list[last].cur].cur;
        list[list[last].cur].data = data;
        list[list[last].cur].cur = 0;
        return OK;
}

void MoveToLast(SLList list, CursorType *lastCur){//移动到最后一个元素
        if (list == NULL || _IsEmpty(list) || lastCur == NULL)
                *lastCur = 0;
        else{
                *lastCur = list[MAXSIZE - 1].cur;
                while (list[*lastCur].cur != 0)*lastCur = list[*lastCur].cur;
        }
}

status InsertFrontSLL(SLList list, ElemType data){//头部插入数据
        if (list == NULL || _IsFull(list))return ERROR;
        CursorType newnode = list[0].cur;
        list[newnode].data = data;
        list[0].cur = list[newnode].cur;
        list[newnode].cur = list[MAXSIZE - 1].cur;
        list[MAXSIZE - 1].cur = newnode;
        return OK;
}

size_t GetRestSpace(const SLList list){//获取剩余的存储空间
        if (list == NULL)return -1;
        size_t count = 0;
        for (CursorType cur = list[0].cur; cur != 0; cur = list[cur].cur, count++);
        return count;
}

status MoveToPrevPos(const SLList list, int pos, CursorType *target){//移动到pos处的前一个元素
        if (list == NULL)return ERROR;
        *target = MAXSIZE - 1;
        pos--;
        while (pos && *target != 0){
                *target = list[*target].cur;
                pos--;
        }
        if (pos == 0){
                return OK;
        }
        else{
                *target = -1;

                //puts("您的插入超出了范围");

                return ERROR;
        }
}

status InsertByPos(SLList list, int pos, ElemType data){//根据位置插入数据
        if (list == NULL || _IsFull(list))return ERROR;
        CursorType target;
        if (MoveToPrevPos(list, pos, &target)){
                CursorType next = list[target].cur;
                list[target].cur = list[0].cur;
                list[0].cur = list[list[target].cur].cur;
                list[list[target].cur].data = data;
                list[list[target].cur].cur = next;
                return OK;
        }
        return ERROR;
}

status RemoveByPos(SLList list, int pos){//根据位置删除元素
        if (list == NULL || _IsEmpty(list) || pos < 1)return ERROR;
        CursorType target;
        if (MoveToPrevPos(list, pos, &target)){
                CursorType curTarget = list[target].cur;
                list[target].cur = list[curTarget].cur;
                list[curTarget].cur = list[0].cur;
                list[0].cur = target;
                return OK;
        }
        return ERROR;
}
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

int main(){
        SLList list;
        InitSLL(list);

        for (int i = 0; i < 5; i++){
                InsertFrontSLL(list, i + 1);
        }

        PrintSLL(list);
        printf("rest=%d\n", GetRestSpace(list));

        RemoveByPos(list, 3);


        PrintSLL(list);
        printf("rest=%d\n", GetRestSpace(list));

        system("pause");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-23 22:19:02 | 显示全部楼层
...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-24 21:15:06 | 显示全部楼层
好牛呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-2 08:04:33 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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