C语言顺序表实现代码排错

今天本来想写段代码练练手,想法挺好结果,栽了个大跟头,在这个错误上徘徊了4个小时才解决,现在分享出来,给大家提个醒,先贴上代码:

代码如下:

/********************************************
 * 文件名称:sqlist.h
 * 文件描述:线性表顺序存储演示
 * 文件作者:by Wang.J,in 2013.11.16
 * 文件版本:1.0
 * 修改记录:
*********************************************/
#ifndef __SQLIST_H__
#define __DWLIST_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE     50
#define OK          0
#define ERR         -1

typedef int elemtype;

typedef struct {
    elemtype data[MAXSIZE];
    int      len;
}sqlist;

int init_list(sqlist *L);
int destroy_list(sqlist *L);
int list_empty(sqlist L);
int list_length(sqlist L);
int disp_list(sqlist L);
int get_elem(sqlist L, int i, elemtype *e);
int local_elem(sqlist L, elemtype e);
int list_insert(sqlist *L, int i, elemtype e);
int list_delete(sqlist *L, int i, elemtype *e);

#endif

/**************************************************
 * 文件名称:sqlist.c
 * 文件描述:线性表顺序存储的实现
 * 文件作者:by Wang.J,in 2013.11.16
 * 文件版本:1.0
 * 修改记录:
***************************************************/
#include "sqlist.h"

#if 0
#define ERR_NONE_ERROR        0
#define ERR_FUNC_EXEC         1
#define ERR_FILE_OPEN         2

char *error_msg[] = {
    /* 0  */    "成功执行,无错误",
    /* 1  */    "函数执行错误",
    /* 2  */    "文件打开错误",
};
int my_errno = 0;
#endif

int main(void)
{
    int ret = 0;
    int i = 0;
    sqlist slist;
    elemtype e;

memset(&slist, 0, sizeof(slist));
    printf("length:%d\n", slist.len);
    ret = init_list(&slist);
    if (OK != ret)
        return -1;

ret = list_empty(slist);
    printf("长度:%d\n", slist.len);
    if (OK == ret)
        printf("顺序表为空\n");
    if (ERR == ret)
        printf("顺序表不为空\n");

for (i = 0; i < 10; i++) {
        e = (elemtype)i;
        list_insert(&slist, i, e);
    }
    printf("插入数据\n");

ret = list_empty(slist);
    if (OK == ret)
        printf("顺序表为空\n");
    if (ERR == ret)
        printf("顺序表不为空\n");

printf("after length%d\n", list_length(slist));

disp_list(slist);

destroy_list(&slist);

return 0;
}

/*=====================================================
 * 函数名称:init_list
 * 函数功能:初始化一个顺序表,创建一个空的顺序表
 * 函数参数:sqlist *L   负责返回一个创建好的顺序表,如果创建
            失败则返回NULL
 * 返 回 值:成功返回0并通过指针返回一个创建好的空表
            失败返回-1指针返回NULL
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int init_list(sqlist *L)
{
    L = (sqlist *)malloc(sizeof(sqlist));

if (NULL == L) {
        L = NULL;
        return -1;
    }

L->len = 0;

return 0;
}

/*=====================================================
 * 函数名称:destroy_list
 * 函数功能:销毁创建好的顺序表,释放顺序表的空间
 * 函数参数:sqlist *L,已经存在的线性表
 * 返 回 值:成功     0
            失败     -1
            通常free不会失败,其实这个函数可以直接使用void
            的,这里只是自己顺手写的,看到代码就知道不会返回0
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int destroy_list(sqlist *L)
{
    free(L);

return 0;
}

/*=====================================================
 * 函数名称:list_empty
 * 函数功能:判断sqlist顺序表是否为空
 * 函数参数:sqlist L,已存在的线性表
 * 返 回 值:空     0
            不空   -1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int list_empty(sqlist L)
{
    if (0 == L.len)
        return 0;

return -1;
}

/*=====================================================
 * 函数名称:list_length
 * 函数功能:取得线性表的长度,返回顺序表中元素个数
 * 函数参数:sqlist L,已经存在的线性表
 * 返 回 值:L的长度
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int list_length(sqlist L)
{
    return L.len;
}

/*=====================================================
 * 函数名称:disp_list
 * 函数功能:显示顺序表中所有的元素
 * 函数参数:sqlist L,已经存在的线性表
 * 返 回 值:成功     0
            失败     -1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int disp_list(sqlist L)
{
    int i = 0;

if (0 >= L.len)
        return -1;

for (i = 0; i < L.len; i++)
        printf("%d\t", L.data[i]);
    /*
     * 这个地方我自己是有异议的,首先你可能不知道输出的类型为
     * %d,再就是求长度是使用list_length函数还是使用L.len方式,
     * list_length是函数调用有着函数调用的额外开销,在PC上这点
     * 开销不算什么,但是在嵌入式系统就不得不考虑这种开销了,
     * 这基本上算是良好的移植性和代码效率之间的问题,为了提高
     * 移植性可以多添加几层抽象层,实现各种判断.除非是极其庞大
     * 的项目或是为了匹配各种这样的设备,我认为像代码定义类型这
     * 种小事,团队沟通就能解决.工作是避免问题,学习是自找问题.
     * 所以怎么取舍只能看个人了.
    */
    printf("\n");

return 0;
}

/*=====================================================
 * 函数名称:get_elem
 * 函数功能:获取i位置元素的值域,为了方便对应i从0开始与
            数组下标一致,用e返回获取的值
 * 函数参数:sqlite L    存在的顺序表
            int    i    位置
            elemtype *e 返回值域
 * 返 回 值:成功     0
            失败     -1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int get_elem(sqlist L, int i, elemtype *e)
{
    if (i < 0 || i >= L.len) {
        e = NULL;
        return -1;
    }

*e = L.data[i];
    /*
     * 这个地方要注意
     * 看看与e = &(L.data[i])区别
    */

return 0;
}

/*=====================================================
 * 函数名称:local_elem
 * 函数功能:按元素值查找,返回第一个与e相匹配的元素位置
 * 函数参数:sqlist L,已经存在的顺序表
 * 返 回 值:存在返回位置
            失败返回-1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int local_elem(sqlist L, elemtype e)
{
    int i = 0;

for (i = 0; i < L.len; i++) {
        if (e == L.data[i])
            return i;
    }

return -1;
}

/*=====================================================
 * 函数名称:list_insert
 * 函数功能:在sqlite的i位置插入元素
 * 函数参数:sqlist *L   已存在的顺序表
            int     i   位置
            elemtype e  元素
 * 返 回 值:成功   0
            失败   -1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int list_insert(sqlist *L, int i, elemtype e)
{
    int j = 0;

if (i < 0 || i > MAXSIZE-1)
        return -1;

for (j = L->len; j > i; j--)
        L->data[j] = L->data[j-1];

L->data[i] = e;
    L->len++;

return 0;
}

/*=====================================================
 * 函数名称:list_delete
 * 函数功能:删除i位置的元素,元素通过e返回
 * 函数参数:sqlite  *L  已存在的顺序表
            int      i  位置
            elemtype *e 删除位置的元素
 * 返 回 值:成功    0
            失败    -1
 * 创 建 人:by Wang.J,in 2013.11.16
 * 修改记录:
======================================================*/
int list_delete(sqlist *L, int i, elemtype *e)
{
    int j = 0;

if (i < 0 || i >=L->len)
        return -1;

*e = L->data[i];
    for (j = i; j < (L->len-1); j++)
        L->data[j] = L->data[j+1];

L->len--;

return 0;
}

很自得,自认为写的很好,运行一下看看,

结果完全出乎意料.

好吧!现在分析错误!

看看main中的定义

代码如下:

int ret = 0;
   int i = 0;
   sqlist slist;
   elemtype e;

看看初始化函数init_list

代码如下:

int init_list(sqlist *L)
{
   L = (sqlist *)malloc(sizeof(sqlist));

if (NULL == L) {
        L = NULL;
        return -1;
    }

L->len = 0;

return 0;
}

相信聪明的你已经看出来了,我在main中定义的slist空间在栈上,而我在init_list中一下子将这个东东分配到了堆空间,并且slist并不是指针,根本无法进行指向,所以结果当然就非常的错误了.

打个比方,栈和堆是两个平行的世界,只有指针是穿梭于两个世界的虫洞,除此以为其他东西无法进行跨越.

知道了原因自然很容易解决了.

由于栈上会自动分配空间所以就无需再次申请空间.所以init_list改为:

代码如下:

int init_list(sqlist *L)
{
    /*
    L = (sqlist *)malloc(sizeof(sqlist));

if (NULL == L) {
        L = NULL;
        return -1;
    }
    */
    L->len = 0;

return 0;
}

就可以了

大家引以为戒.

(0)

相关推荐

  • C语言实现动态顺序表的实现代码

    C语言实现动态顺序表的实现代码 顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 静态实现:结构体内部只需两个成员,其中一个为固定大小(MAX)的数组,用来存放我们的数据.数组大小我们可以通过在头文件中改变MAX的值来改变. 动态实现:在内存中开辟一块空间,可以随我们数据数量的增多来扩容. 来看看动态的顺序表实现: 1.seqli

  • C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 接下来看看静态的顺序表,直接上代码: SeqList.h #define _CRT_SECURE_NO_WARNINGS 1 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <stdlib.h&g

  • C语言顺序表的实现代码

    本文实例为大家分享了C语言实现顺序表的具体代码,供大家参考,具体内容如下 seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include<cstdio> #include<malloc.h> #include<assert.h> #define SEQLIST_INIT_SIZE 8 #define INC_SIZE 3 //空间增量的大小 typedef int ElemType; typedef stru

  • C语言实现顺序表基本操作汇总

    本文汇总了C语言下实现及操作顺序表的方法,对于学习数据结构的朋友来说是一个不错的参考程序.完整代码如下: #include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int status ;

  • c语言实现顺序表的基本操作

    数据结构顺序表操作 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <malloc.h>#define LIST_INIT_SIZE 100#define LISINCREMENT 10#define ElemType int#define Status inttypedef struct Sq{ ElemType *elem; int length; int listsize;}SqList;Statu

  • C语言线性表的顺序表示与实现实例详解

    1.概述 通常来说顺序表是在计算机的内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性数据结构.线性表采用顺序存储的方式存储就称之为顺序表.顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中. 将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构就是顺序结构. 采用顺序存储结构的线性表简称为" 顺序表".顺序表的存储特点是:只要确定了起始位置,表中任一元素的地址都通过下列公式得到:LOC(ai)=LOC(a1)+(i-1)*L 1≤

  • 用C语言举例讲解数据结构中的算法复杂度结与顺序表

    数据结构算法复杂度 1.影响算法效率的主要因素 (1)算法采用的策略和方法: (2)问题的输入规模: (3)编译器所产生的代码: (4)计算机执行速度. 2.时间复杂度 // 时间复杂度:2n + 5 long sum1(int n) { long ret = 0; \\1 int* array = (int*)malloc(n * sizeof(int)); \\1 int i = 0; \\1 for(i=0; i<n; i++) \\n { array[i] = i + 1; } for(

  • 利用C语言实现顺序表的实例操作

    本文实例讲述了C语言实现顺序表(线性表)的方法.分享给大家供大家参考,具体如下: 一:顺序表代码实现 #ifndef _SEQ_LIST_H #define _SEQ_LIST_H #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define ElemType float //以float类型测试算法通用性,而不是以惯用的int #define I

  • C语言顺序表实现代码排错

    今天本来想写段代码练练手,想法挺好结果,栽了个大跟头,在这个错误上徘徊了4个小时才解决,现在分享出来,给大家提个醒,先贴上代码: 复制代码 代码如下: /******************************************** * 文件名称:sqlist.h * 文件描述:线性表顺序存储演示 * 文件作者:by Wang.J,in 2013.11.16 * 文件版本:1.0 * 修改记录:*********************************************/

  • 插入排序的顺序表实现代码

    复制代码 代码如下: #include<stdio.h>typedef struct { int key;}RecType;typedef struct { RecType R[100+1]; int Length;}SqList; #define N 11//为测试方便,直接输入11个整数void InsertSort(SqList *L){ int i,j; for(i=2;i<=L->Length;i++)  if(L->R[i].key<L->R[i-1]

  • C语言使用顺序表实现电话本功能

     简介: 用顺序表实现电话本的功能(C语言) 电话本具有如下4个功能: 1.创建一个电话本,电话本里面包含名字和电话号码 2.在指定位置插入一个名字和电话号码 3.在指定位置删除一个名字和电话号码 4.打印电话本 代码: //其中那个color函数是我为了美观加上去的,如果感觉不需要的话可以将代码中所有有关color的都删掉即可 #include <iostream> #include <cstdio> #include <cstring> #include <a

  • C++顺序表实现图书管理系统

    本文为大家分享了C++顺序表实现图书管理系统的具体代码,供大家参考,具体内容如下 图书信息表包括以下10项常用的基本操作:图书信息表的创建和输出.排序.修改.逆序存储.最贵图书的查找.最爱图书的查找.最佳位置图书的查找.新图书的入库.旧图书的出库.图书去重. 代码: #include<iostream> #include<iomanip> #include<string> using namespace std; //函数结果状态代码 #define OK 1 #def

  • Java顺序表实现图书管理系统

    本文实例为大家分享了Java顺序表实现图书管理系统的具体代码,供大家参考,具体内容如下 一.简介 实现此项目的目的是巩固并理解前面的知识点:类,抽象类,封装,继承,多态,接口等 二.核心需求 管理端   查阅书籍   增加书籍   删除书籍   打印书籍列表   退出系统 用户端   查询书籍   借阅书籍   归还书籍   打印书籍列表   退出系统 三.类的设计 1. 创建图书类 图书类中包含图书的名称,价格,类型,作者和是否被借出等信息,并生成构造方法,Getter()和Setter()方

  • python单链表实现代码实例

    链表的定义:链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就能够访问整个结点序列.也就是说,结点包含两部分信息:一部分用于存储数据元素的值,称为信息域:另一部分用于存储下一个数据元素地址的指针,称为指针域.链表中的第一个结点的地址存储在一个单独的结点中,称为头结点或首结点.链表中的最后一个结点没有后继元素,其指针域为空. python单链表实现代码: 复制代码

  • C语言 数据结构之链表实现代码

    前言 最近在复习数据结构的相关知识,感觉在初学的时候还是有很多东西没有掌握,不过现在终于算是搞得比较有头绪了,所以就在写出来和大家一起分享! 什么是链表 简单的说,链表就是由多个结点离散分配,彼此通过指针相连,每个结点只有一个前驱结点和后继结点.首节点无前驱结点,为结点无后继结点的一种存储结构. 链表的结构 头结点:链表的第一个有效结点前面的结点,头结点并不存放有效数据,也就是数据域为空,加头结点的主要目的是为了方便链表的操作. 首节点:链表的第一个有效结点,结点包含数据域和指针域. 尾结点:尾

  • python版本单链表实现代码

    今天看了一下数据结构的书,发现其实数据结构没有几种,线性表,数组,字符串,队列和栈,等等,其实是一回事,然后就是树结构,图结构.数据结构的理论并不难,主要是要自己写一下这些数据结构以及对应的基本的操作方法,这样就能够更快的提高. 这一篇blog写一下线性表. 线性表:分为顺序表和链表 一.顺序表 顺序表就是相对于表中的数据,地址也是顺序的,所以可以随机存取.但是在操作插入和删除元素的时候,由于要满足地址的连续性,所以要移动很多的元素位置,因此,插入或者删除一个顺序表的元素的时间复杂度是o(n).

  • PHP Array交叉表实现代码

    如果使用sql语句做的话 工作量太大了,于是尝试自己写一个交叉表的类,好二话不说,我们看看代码 复制代码 代码如下: /** * 基本交叉表 * @author hugh * */ class Pivot { private $HORIZONTAL_TOTAL_FIELD = 'total'; private $VERTICAL_TOTAL_FIELD = 'total'; private $data; private $topPivot; private $leftPivot; private

  • 学习python之编写简单乘法口诀表实现代码

    实现代码一. #!/usr/bin/python x,y=9,9 lst=[(x,y,str(y)+'X'+str(x)+'='+str(x*y)) for x in range(1,y+1) for y in range(1,x+1)] for item in lst: print item[2], if(item[0]==item[1]): print '\n' 实现代码二. for i in range(1,10): for j in range(1,i+1): print str(i*j

随机推荐