| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2431 人关注过本帖
标题:顺序链表插入错误
只看楼主 加入收藏
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
结帖率:82.35%
收藏
 问题点数:0 回复次数:3 
顺序链表插入错误
程序代码:
#include<stdio.h>
#include<malloc.h>
#define TURE 1
#define ERROR 0
#define MAXSIZE 100
typedef struct {
    int elem[MAXSIZE];
    int last;
}SqList;
void InitList(SqList *L,int e)
{
    L->last=e-1;
}//组建
int InsertList(SqList *L,int i,int e)
{
    int k;
    if(i<1||i>L->last+2)
    {
        printf("插入不符合\n");
        return ERROR;
    }
    if(L->last>=MAXSIZE-1)
    {
        printf("线性表已满\n");
        return ERROR;
    }
    for(k=L->last;k>=i-1;k--)
    {
        L->elem[k+1]=L->elem[k];
    }
    e=L->elem[i-1];
    L->last++;
    return TURE;
}//插入
int DeleteList(SqList *L,int i,int *e)
{
    int k;
    if(i<1||i>L->last+1)
    {
        printf("不合法\n");
        return ERROR;
    }
    *e=L->elem[i-1];
    for(k=i;k<=L->last;k++)
    {
        L->elem[k-1]=L->elem[k];
    }
    L->last--;
    return TURE;
}//删除
int SearchList(SqList L,int e)
{
    int i=0;
    while(i<=L.last&&L.elem[i]!=e)
        i++;
    if(i<=L.last)
    {
        return i+1;
    }
    else
        return ERROR;
}
//查找
void menu()
{
    printf("第一步首先建立一个线性表\n");
    printf("1  建立\n");
    printf("2  插入\n");
    printf("3  删除\n");
    printf("4  查找\n");
    printf("5  遍历输出\n");
    printf("6  退出\n");

}
int main()
{
    int i,e;
    int num,location,length,number;
    int *data;
    SqList *L;
    data=(int *)malloc(sizeof(int));
    menu();
    while(1)
        {
            printf("请输入你的序号\n");
            scanf("%d",&num);
            switch(num)
            {
            case 1:
                L=(SqList *)malloc(sizeof(SqList));
                printf("请输入线性表的长度\n");
                scanf("%d",&length);
                InitList(L,length);
                printf("请依次输入线性表的长度\n");
                for(i=0;i<length;i++)
                {
                    scanf("%d",&number);
                    L->elem[i]=number;
                }
                printf("插入成功\n");
                break;
            case 2:
                printf("请输入你要插入的数值和位置\n");
                scanf("%d %d",&e,&location);
                if(InsertList(L,location,e)==TURE)
                    printf("插入成功\n");
                else
                    printf("插入失败\n");
                break;
            case 3:
                printf("请输入你要删除的节点\n");
                scanf("%d",&i);
                if(DeleteList(L,i,data))
                    printf("删除成功,你所删除的节点的值是%d\n",*data);
                else
                    printf("删除失败\n");
                break;
            case 4:
                printf("请输入你要查找的数值\n");
                scanf("%d",&e);
                location=SearchList(*L,e);
                printf("你所查找的是%d个节点数\n",location);
                break;
            case 5:
                for(i=0;i<=L->last;i++)
                {
                    printf("%d ",L->elem[i]);
                }
                break;
            case 6:
                return 0;


            }
        }
        printf("\n");
        return 0;
}


谁能帮我看看,执行插入的时候怎么不符合常理呢?
2016-10-06 16:25
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
收藏
得分:0 
e=L->elem[i-1];//这个写反了
2016-10-06 16:39
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
与代码的作用与否无关。只是交流一下编程习惯的问题。

我老师曾讲过  尽量在所有定义变量的地方直接初始化它,避免后续代码可能出现忘了初始化就直接拿起来用,然后还要浪费一些时间去做调试。当然这样的错误非常低级,很容易可以检查出来,甚至现在不少编程软件都会帮你检测你定义的变量有没有初始化就拿起来用了?你定义的变量会不会根本就没用过。
        另外,你不单单要记得初始化变量,更应该尽可能每定义一个变量就直接在那个地方初始化它,因为这样会方便代码写完以后别人来阅读它的时候能够更快更容易地理解每一个变量究竟是什么意思。
比如下面这一部分:
程序代码:
int main()
{
    int i,e;
    int num,location,length,number;
    int *data;
    SqList *L;
    data=(int *)malloc(sizeof(int));
修改成:
程序代码:
int main()
{
    int i=0,e=0;//i,e是计数器我们通常从0开始使用所以索性第一次初始化就是0
    int num=-1,location=-1,length=-1,number=-1;//这些数字是要用scanf读入的,如果某个时刻你的代码流程控制不对,某一个变量没读入就被使用了。这种情况下-1会比0更容易让你恍然大悟,联想到是不是你还没读数字。当然了,你要是愿意用其它特殊的数字比如-7,他可能比-1还要特殊一点。
    int *data=(int *)malloc(sizeof(int));//把变量的初始化和变量定义放到一起,往小了说,它让你少写了几个字符。往大了就是人家一看到这行代码就能清楚data不是用于迭代的指针,他指向独立的内存位置
    SqList *L=NULL;//指针初始化为NULL可以保证你不会没初始化、没赋值就去使用这个指针,因为对NULL的任何操作都会导致程序异常终止。




这只是编程习惯。人家是这么教导我的,他没有强制要求我必须这么做。只不过我也认为这样蛮好的。所以讲出来跟你分享一下。仅此而已,无关对错。




φ(゜▽゜*)♪
2016-10-07 19:01
星野
Rank: 2
来 自:河北
等 级:论坛游民
帖 子:73
专家分:26
注 册:2016-4-13
收藏
得分:0 
回复 3楼 书生牛犊
en   谢谢版主  我好多东西都是自学的  在学校老师也不管 所以很多编程习惯也不太清楚  请多多关照!
2016-10-08 16:17
快速回复:顺序链表插入错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020650 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved