标题:调试程序,线性表!
只看楼主
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
 问题点数:0 回复次数:9 
调试程序,线性表!

程序能运行,但算法有错误!!
怎么也得不了正确结果, 我感觉void ListInsert2(Sqlist *L) 有错误!!
调了好长时间还是不行,帮帮忙!

#include <stdio.h>
#include <malloc.h>
#define LISTSIZE 10

typedef struct
{
int *elem;
int length;
int listsize;
}SqList;

void InitList(SqList *L);
void DestroyList(SqList *L);
int ListEmpty(SqList *L);
int ListLength(SqList *L);
int GetElem(SqList *L, int i, int *e);
void ListInsert(SqList *L, int n);
void ListInsert2(SqList *L, int i, int e);
int ListDelete(SqList *L, int i, int *e);
void Print(SqList *L);

int main(void)
{
int k, length, e1, e2, z;

SqList L;

InitList(&L);
ListInsert(&L, LISTSIZE - 1);
Print(&L);
ListInsert2(&L, 2, 20);
Print(&L);

z = ListDelete(&L, 3, &e1);
k = GetElem(&L, 4, &e2);
Print(&L);
length = ListLength(&L);

printf("z = %d\n",z);
printf("k = %d\n",k);
printf("length = %d\n",length);
Print(&L);

ListInsert2(&L, 2, 4);
Print(&L);

length = ListLength(&L);
printf("length = %d\n",length);

return 0;
}

void InitList(SqList *L)
{
(*L).elem = (int*)malloc(LISTSIZE * sizeof(int));
if (!(*L).elem) exit(1);

(*L).length = 0;
(*L).listsize = LISTSIZE;
}

void DestroyList(SqList *L)
{
if ((*L).elem == NULL) exit(1);

free((*L).elem);

(*L).elem = NULL;
}


int ListEmpty(SqList *L)
{
if ((*L).elem == NULL) exit(1);
if ((*L).length == 0) return 0;
else return 1;
}

int ListLength(SqList *L)
{
if ((*L).elem == NULL) exit(1);
return (*L).length;
}

int GetElem(SqList *L, int i, int *e)
{
if ((*L).elem == NULL) exit(1);
if (i<1 || i>((*L).length + 1)) return -1;
e = &(*L).elem[i];
return *e;
}

void ListInsert(SqList *L, int n)
{
int i;
if ((*L).elem == NULL) exit(1);

for (i = 0; i < n; i++)
{
printf("Enter one number:\n");
scanf("%d",&(*L).elem[i]);

++(*L).length;
}
}

void ListInsert2(SqList *L, int i, int e)
{
int *p,j,*q;

if ((*L).elem == NULL) exit(1);
if (i<1 || i>((*L).length + 1)) exit(1);


p = &(*L).elem[(*L).length - 1];
for (j = (*L).length -1; j >= i-1; --j)
{
*(p + 1) = *p;
}
q = &(*L).elem[i];

*q = e;
}

int ListDelete(SqList *L, int i, int *e)
{
int *p;
int j;
if ((*L).elem == NULL) exit(1);
if (i<1 || i>((*L).length +1)) exit(1);

*e = (*L).elem[i];
p = &(*L).elem[i];

for (j = i+1; j <((*L).length - 1); ++j)
{
*(p - 1) = *p;
}
--(*L).length;
return *e;
}

void Print(SqList *L)
{
int i;

if ((*L).elem == NULL) exit(1);

for ( i = 0; i < (*L).length; i++)
{
printf("%d ",(*L).elem[i]);
}

printf("\n");
}

搜索更多相关主题的帖子: int 线性 SqList void 
2006-05-18 13:52
gaga
Rank: 1
等 级:新手上路
威 望:2
帖 子:307
专家分:0
注 册:2006-4-5
得分:0 
现在没有时间看了
晚上有空的话看看吧

明天的明天还有明天。 可是今天却只有一个。 public Copy from 无缘今生
2006-05-18 14:02
gaga
Rank: 1
等 级:新手上路
威 望:2
帖 子:307
专家分:0
注 册:2006-4-5
得分:0 

void ListInsert2(SqList *L, int i, int e)
{
int *p,j,*q;

if ((*L).elem == NULL) exit(1);
if (i<1 || i>((*L).length + 1)) exit(1);


p = &(*L).elem[(*L).length - 1];
for (j = (*L).length -1; j >= i-1; --j)
{
*(p + 1) = *p;
p--;你的p要向前移动才可以
}
q = &(*L).elem[i];这不对,你把i-1都移走了;这就座是elem[i-1]

*q = e;
}

我没有调,你试下能不能用/

[此贴子已经被作者于2006-5-18 16:20:21编辑过]


明天的明天还有明天。 可是今天却只有一个。 public Copy from 无缘今生
2006-05-18 16:20
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 
太长了

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-18 16:24
gaga
Rank: 1
等 级:新手上路
威 望:2
帖 子:307
专家分:0
注 册:2006-4-5
得分:0 
你写的时候都没有注意那个
第i个数的下标是i-1你都写成了i,
还有你插入的时候不判断,你自己申请了10个就往后移动,
那样不好
你插入的时候先看看*L.elem[0]空不空,
用那个realloc申请空间,具体怎么用看看书,不要事先就定为刚刚好10个,那样不好


明天的明天还有明天。 可是今天却只有一个。 public Copy from 无缘今生
2006-05-18 16:36
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 

不好意思,你的我要是看完了,怕晕过去,我给你写了一个

#include <stdio.h>
#include <stdlib.h>
#define LISTSIZE 5
#define INCREMENT 10

typedef struct
{
int *elem;
int length;
int listsize;
}SqList;

static void Instruction(void); /* 菜单函数 */
static void InitialList(SqList *L); /* 初始化函数 */
static void CreateList(SqList *L); /* 创建顺序表函数 */
static void InsertElem(SqList *L, int pos, int item); /* 插入一个元素函数 */
static void DeleteElem(SqList *L, int pos); /* 删除指定位置元素函数 */
static int SearchElem(SqList L, int item); /* 查找某元素 */
static void VisitList(SqList L); /* 打印顺序表 */
static void DestroyList(SqList *L); /* 销毁顺序表 */

int main(void)
{
SqList L;
int pos, item, choice, index = -1;

Instruction();
scanf("%d", &choice);
while (choice != 0)
{
switch (choice)
{
case 1:
InitialList(&L);
CreateList(&L);
VisitList(L);
break;
case 2:
printf("Enter insert position and item: ");
scanf("%d %d", &pos, &item);
InsertElem(&L, pos, item);
VisitList(L);
break;
case 3:
printf("Enter delete position: ");
scanf("%d", &pos);
DeleteElem(&L, pos);
VisitList(L);
break;
case 4:
printf("Enter search element: "); /* 查找指定元素的下标 */
scanf("%d", &item);
index = SearchElem(L, item);
if (index != -1)
{
printf("index = %d\n", index);
}
else
{
printf("No found.\n");
}
break;
default:
printf("Invalid enter.\n");
break;
}
Instruction();
scanf("%d", &choice);
}

return 0;
}

static void Instruction(void)
{
printf("Enter your choice(0-quit):\n");
printf("1-CreateList.\n");
printf("2-InsertElem.\n");
printf("3-DeleteElem.\n");
printf("4-SearchElem.\n");
}

static void InitialList(SqList *L)
{
if ((((*L).elem = (int*)malloc(sizeof(int) * LISTSIZE))) == NULL)
{
exit(1);
}
(*L).length = 0;
(*L).listsize = LISTSIZE;
}

static void CreateList(SqList *L)
{
while (1) /* 利用无限循环,输入0退出 */
{
printf("Enter integral(0-quit): ");
scanf("%d", &(*L).elem[(*L).length++]);
if ((*L).elem[(*L).length - 1] == 0)
{
(*L).length--;
break;
}
else
{
if ((*L).length >= (*L).listsize)
{
if ((((*L).elem = (int*)realloc((*L).elem, sizeof(int) * ((*L).listsize + INCREMENT)))) == NULL)
{
exit(1);
}
(*L).listsize += INCREMENT;
}
}
}
}

static void InsertElem(SqList *L, int pos, int item)
{
int *p, *q;

if (pos < 1 || pos > (*L).length + 1)
{
printf("insert position error.\n");
return ;
}
if ((*L).length >= (*L).listsize)
{
if ((((*L).elem = (int*)realloc((*L).elem, sizeof(int) * ((*L).listsize + INCREMENT)))) == NULL)
{
exit(1);
}
(*L).listsize += INCREMENT;
}

p = &(*L).elem[pos - 1];

for (q = &(*L).elem[(*L).length - 1]; q >= p; q--)
{
*(q + 1) = *q;
}
*p = item;

(*L).length++;
}

static void DeleteElem(SqList *L, int pos)
{
int *p, *q;

if (pos < 1 || pos > (*L).length) /* 删除位置错误 */
{
printf("delete element position error.\n");
return ;
}

p = &(*L).elem[pos - 1]; /* 指向被删除元素地址 */

for (q = p + 1; q <= &(*L).elem[(*L).length - 1]; q++)
{
*(q - 1) = *q;
}
(*L).length--;
}

static int SearchElem(SqList L, int item)
{
int i;

for (i = 0; i < L.length; i++)
{
if (L.elem[i] == item)
{
return i;
}
}

return -1;
}

static void VisitList(SqList L)
{
int i;

for (i = 0; i < L.length; i++)
{
printf("%d ", L.elem[i]);
}
printf("\n");
}

static void DestroyList(SqList *L)
{
if ((*L).elem != NULL)
{
free((*L).elem);
(*L).elem = NULL;
}
(*L).length = 0;
}

















































日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-18 16:37
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
得分:0 

谢谢论坛 大哥
能给我讲讲什么时候该用*L,什么时候该用L 吗 ?
我都快晕啦!!

static void Instruction(void); /* 菜单函数 */
static void InitialList(SqList *L); /* 初始化函数 */
static void CreateList(SqList *L); /* 创建顺序表函数 */
static void InsertElem(SqList *L, int pos, int item); /* 插入一个元素函数 */
static void DeleteElem(SqList *L, int pos); /* 删除指定位置元素函数 */
static int SearchElem(SqList L, int item); /* 查找某元素 */
static void VisitList(SqList L); /* 打印顺序表 */
static void DestroyList(SqList *L); /* 销毁顺序表 */


奋斗改变一切!!
2006-05-18 17:57
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 

需要修改顺序表本身的情况下用'*', 不修改就不用了,和指针的用法一样


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-18 18:14
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
得分:0 
谢谢啦,明白!!

奋斗改变一切!!
2006-05-18 18:15
独角龙
Rank: 1
等 级:新手上路
帖 子:221
专家分:0
注 册:2006-5-5
得分:0 
下面为什么不同啊!!
static void InsertElem(SqList *L, int pos, int item)
if (pos < 1 || pos > (*L).length + 1)
static void DeleteElem(SqList *L, int pos)
if (pos < 1 || pos > (*L).length)

奋斗改变一切!!
2006-05-18 20:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-65257-1-1.html




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

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