注册 登录
编程论坛 数据结构与算法

快来帮我看看这个线性表啊,花了近2个小时就是出不来我想要的结果(求详解)

liuguanglei 发布于 2012-11-01 16:55, 953 次点击
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define listincrement 10
typedef int Elemtype;
typedef struct
{
    Elemtype  *elem;
    int length;
    int listsize;
}Sqlist;
//进行空表的创建
 InitList(Sqlist L)
{
       L.elem=(Elemtype * )malloc(LIST_INIT_SIZE * sizeof(Elemtype));
     if(!L.elem)
     return 0;
     L.length=0;
     L.listsize=LIST_INIT_SIZE;
     return 1;
}
 //在表中插入元素x
 ListInsert(Sqlist L,int i,Elemtype x)
{
     int j;
    if(i<0||i>L.length)
        return 0;
    for(j=L.length-1;j<=i+1;j--)
        L.elem[j+1]=L.elem[j];
        L.elem[i+1]=x;
        L.length++;
        return 1;
}
 //删除表中第I个位置上的元素
 ListDelete(Sqlist L,int i)
{
    int j;
    for(j=i+1;j<L.length-1;j++)
        L.elem[j-1]=L.elem[j];
    L.length--;
    return 1;
}
int main()
{
    Sqlist L;
    int k;
    int j;
    int i;
    InitList(L);
    printf("please input 9 numbers:");
    for(i=0;i<9;i++)
    scanf("%d",&L.elem[i]);
    for(i=0;j<L.length;i++)
    printf("%4d",L.elem[i]);
    printf("请输入要删除的元素的位置k:");
    scanf("%d",&k);
    ListDelete(L,k);
    printf("删除后的序列:\n");
    for(i=0;j<L.length;i++)
    printf("%4d",L.elem[i]);
    printf("\n");
}
17 回复
#2
青春无限2012-11-01 17:48
先看看
#3
星闪夜空2012-11-01 18:30
回复 楼主 liuguanglei
指出你两个问题:
 一:你通过Sqlist L定义一个结点,然后通过InitList(L)将L传到InitList函数进行处理,你这里是传值而不是传址!!!  
 二:在InitList(Sqlist L)函数中,你只是将结点中的指针分配内存空间,并不是给这个结点分配内存空间.
 
#4
凌云飞翔2012-11-01 18:39
你先看看倒数第三行有没有问题。。。
#5
凌云飞翔2012-11-01 18:41
你貌似插入的那个函数没有用上呀
下面的程序你看看吧。。。
注意 & (取地址)。。

#include<stdio.h>
 #include<stdlib.h>
 #define LIST_INIT_SIZE 100
 #define listincrement 10
 typedef int Elemtype;
 typedef struct
 {
     Elemtype  *elem;
     int length;
     int listsize;
 }Sqlist;
 //进行空表的创建
int  InitList(Sqlist &L)
 {
        L.elem=(Elemtype * )malloc(LIST_INIT_SIZE * sizeof(Elemtype));
      if(!L.elem)
      return 0;
      L.length=0;
      L.listsize=LIST_INIT_SIZE;
      return 1;
 }
 //在表中插入元素x
/*  int  ListInsert(Sqlist &L,int i,Elemtype x)
 {
      int j;
     if(i<0||i>L.length)
         return 0;
     for(j=L.length-1;j<=i+1;j--)
         L.elem[j+1]=L.elem[j];
         L.elem[i+1]=x;
         L.length++;
         return 1;
 }*/
 //删除表中第I个位置上的元素
   int ListDelete(Sqlist &L,int i)
 {
     int j;
     for(j=i;j<=L.length-1;j++)
         L.elem[j-1]=L.elem[j];
         L.length--;
     return 1;
 }
  main()
 {
     Sqlist L;
     int k;
     int j;
     int i;
     InitList(L);
     printf("please input 9 numbers:\n");
     for(i=0;i<9;i++)
     scanf("%d",&L.elem[i]);
      L.length=9 ;
      printf("请输入要删除的元素的位置k:\n");
     scanf("%d",&k);
     ListDelete(L,k);
     printf("删除后的序列:\n");
     for(i=0;i<L.length;i++)
     printf("%4d",L.elem[i]);
     printf("\n");
 }
#6
liuguanglei2012-11-01 22:18
回复 5楼 凌云飞翔
运行还是不出结构啊,但是不报错,郁闷啊
#7
爱闹的娃2012-11-01 22:33
建议LZ将错误说明白些许....
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define listincrement 10
typedef int Elemtype;
typedef struct
{
     Elemtype  *elem;
     int length;
     int listsize;
}Sqlist;
//进行空表的创建
int  InitList(Sqlist &L)//这里是引用...在c里面是没有引用的,LZ可以考虑用指针int  InitList(Sqlist *L)。。。。下同
{
        L.elem=(Elemtype * )malloc(LIST_INIT_SIZE * sizeof(Elemtype));
      if(!L.elem)
      return 0;
      L.length=0;
      L.listsize=LIST_INIT_SIZE;
      return 1;
}
//在表中插入元素x
/*
  int  ListInsert(Sqlist &L,int i,Elemtype x)
{
      int j;
     if(i<0||i>L.length)
         return 0;
     for(j=L.length-1;j<=i+1;j--)
         L.elem[j+1]=L.elem[j];
         L.elem[i+1]=x;
         L.length++;
         return 1;
}
*/
//删除表中第I个位置上的元素
   int ListDelete(Sqlist &L,int i)
{
     int j;
     for(j=i;j<=L.length-1;j++)
         L.elem[j-1]=L.elem[j];
         L.length--;
     return 1;
}
  main()
{
     Sqlist L;
     int k;
     int j;
     int i;
     InitList(L);//按照指针的话就得传如地址InitList(&L);
     printf("please input 9 numbers:\n");
     for(i=0;i<9;i++)
     scanf("%d",&L.elem[i]);
      L.length=9 ;
      printf("请输入要删除的元素的位置k:\n");
     scanf("%d",&k);
     ListDelete(L,k);
     printf("删除后的序列:\n");
     for(i=0;i<L.length;i++)
     printf("%4d",L.elem[i]);
     printf("\n");
}
#8
liuguanglei2012-11-01 22:42
回复 7楼 爱闹的娃
在函数的传值过程中这个形参可以不用指针啊,可以实参和形参直接进行值与值的传递
#9
liuguanglei2012-11-01 22:46
回复 7楼 爱闹的娃
用VC6.0DOS窗口老蹦亏,就是顺序表的操作为什么就这么难啊
#10
凌云飞翔2012-11-01 23:11
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#11
凌云飞翔2012-11-01 23:12
我的可以呀,你用啥软件编的、、
#12
liuguanglei2012-11-01 23:37
回复 11楼 凌云飞翔
不会吧啊我用VC6.0
#13
爱闹的娃2012-11-02 09:38
回复 8楼 liuguanglei
....实参与形参之间是可以值与值的传递....实参只是把值给了另外一个变量(简单点叫拷贝),LZ如果不用指针或者引用(c++)
根本就不是在对实参进行操作...是在对形参进行一系列的操作....而这样的操作是徒劳的....
#14
凌云飞翔2012-11-02 11:38
把你修改过的代码,再贴出来看看
#15
liuguanglei2012-11-02 23:40
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define listincrement 10
typedef int Elemtype;
typedef struct
{
    Elemtype  *elem;
    int length;
    int listsize;
}Sqlist;
//进行空表的创建
int InitList(Sqlist L)
{
     int i;
        L.elem=(Elemtype * )malloc(LIST_INIT_SIZE * sizeof(Elemtype));
     if(!L.elem)
     return 0;
     else
     printf("请输入顺序表中的元素:");
     for(i=0;i<9;i++)
     scanf("%d",&L.elem[i]);
     L.length=0;
     L.listsize=LIST_INIT_SIZE;
     return 1;
}
 //在表中插入元素x
int ListInsert(Sqlist L,int i,Elemtype x)
{
     int j;
    if(i<0||i>L.length)
        return 0;
    for(j=L.length-1;j<=i+1;j--)
        L.elem[j+1]=L.elem[j];
        L.elem[i+1]=x;
        L.length++;
        return 1;
}
 //删除表中第I个位置上的元素
int ListDelete(Sqlist L,int i)
{  
    int j;
    for(j=i+1;j<L.length-1;j++)
        L.elem[j-1]=L.elem[j];
    L.length--;
    return 1;
}
int main()
{
    Sqlist L;
    int k;
    int j;
    int i;
    InitList(L);
    //printf("please input 9 numbers:");
//    for(i=0;i<9;i++)
//    scanf("%d",&A.elem[i]);
//    A.length=9;
    printf("请输入要插入元素的位置:");
        scanf("%d",k);
    ListInsert(L,k,1);
    for(i=0;j<L.length;i++)
    printf("%4d",L.elem[i]);
    printf("请输入要删除的元素的位置k:");
    scanf("%d",&k);
    ListDelete(L,k);
    printf("删除后的序列:\n");
    for(i=0;j<L.length;i++)
    printf("%4d",L.elem[i]);
    printf("\n");
}
#16
凌云飞翔2012-11-03 00:46
倒数第三行看清楚是for中间是i<L.length
#17
凌云飞翔2012-11-03 09:41
程序代码:
#include<stdio.h>

 #include<stdlib.h>

 #define LIST_INIT_SIZE 100

 #define listincrement 10

 typedef int Elemtype;

 typedef struct

 {
     Elemtype  *elem;
     int length;
     int listsize;

 }Sqlist;

 //进行空表的创建
int InitList(Sqlist &L)

 {
      int i;
         L.elem=(Elemtype * )malloc(LIST_INIT_SIZE * sizeof(Elemtype));
      if(!L.elem)
      return 0;
      L.length=0;
      L.listsize=LIST_INIT_SIZE;
      return 1;

 }

 //在表中插入元素x
int ListInsert(Sqlist &L,int i,Elemtype x)

 {
      int j;
     if(i<0||i>L.length)
         return 0;
     for(j=L.length-1;j>=i-1;j--)
         L.elem[j+1]=L.elem[j];
         L.elem[i-1]=x;
         L.length++;
         return 1;

 }

 //删除表中第I个位置上的元素
int ListDelete(Sqlist &L,int i)

 {
     int j;
     for(j=i;j<L.length;j++)
         L.elem[j-1]=L.elem[j];
     L.length--;
     return 1;

 }

 int main()

 {
     Sqlist L;
     int k;
     int j;
     int i;
     InitList(L);
     printf("please input 9 numbers:\n");
     for(i=0;i<9;i++)
      scanf("%d",&L.elem[i]);
       L.length=9;
     printf("请输入要插入元素的位置:");
         scanf("%d",&k);
     ListInsert(L,k,1);
     for(i=0;i<L.length;i++)
     printf("%4d",L.elem[i]);
     printf("\n请输入要删除的元素的位置k:");
     scanf("%d",&k);
     ListDelete(L,k);
     printf("删除后的序列:\n");
     for(i=0;i<L.length;i++)
     printf("%4d",L.elem[i]);
     printf("\n");

 }
#18
凌云飞翔2012-11-03 09:42
你的错误很多,建议把我的和你的比较一下,找找不同点。。。希望对你有所帮助。。
1