QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 764|回复: 2

问两个数据结构问题,谢谢了

[复制链接]
发表于 2004-5-19 12:22:23 | 显示全部楼层 |阅读模式
第一个是线性表顺序链接。编译成功,运行有个小错误。就是删除结点结束后。最后一个结点和前驱结点相同。我找来找去找不出原因。郁闷中。
[code:1]
#include <stdio.h>
#define maxsize 10

typedef struct sqlist
{
  int data[maxsize];
  int last;
} sqlistTp;

int main()
{
  sqlistTp L;
  int input;
  int count = 1;
  Initsqlist (&L);
  printf("请输入一些数字:");
  scanf("%d", &input);
  while (input != 0)
    {
      insert_sqlist (&L, input, count);
      count++;
      scanf("%d", &input);
    }
  print_sqlist(&L);
  length_sqlist(&L);
  printf("请输入要插入的数据:");
  scanf("%d", &input);
  printf("请输入要插入的位置:");
  scanf("%d", &count);
  insert_sqlist (&L, input, count);
  print_sqlist(&L);
  length_sqlist(&L);
  printf("请输入要读出数字的位置:");
  scanf("%d", &count);
  get_sqlist(&L, count);
  printf("请输入要查找(按值查找)的数字:");
  scanf("%d", &input);
  locate_sqlist(&L, input);
  printf("请输入要删除的位置:");
  scanf("%d", &count);
  delete_sqlist (&L, count);
  print_sqlist(&L);
  length_sqlist(&L);
}

int Initsqlist (sqlistTp *L)
{
  L -> last = 0;
  return (1);
}

int insert_sqlist (sqlistTp *L, int x, int i)
{
  int j;
  if (L -> last == maxsize)
    {
      printf("\n表满!\n");
      return 0;
    }
  if ((i < 1) || (i > L -> last + 1))
    {
      printf("\n非法位置!\n");
      return 0;
    }
  for (j = L -> last; j >= i; j--)
    L -> data[j] = L -> data[j - 1];
  L -> data[i - 1] = x;
  L -> last = L -> last + 1;
}

int print_sqlist (sqlistTp *L)
{
  int i;
  printf("当前线性表排列为:\n");
  for (i = 0; i < L -> last; i++)
    printf("%d ", L -> data[i]);
  printf("\n");
}

int length_sqlist (sqlistTp *L)
{
  printf("表长为:%d\n", L -> last);
}

int get_sqlist (sqlistTp *L, int i)
{
  if ((i < 0) || (i > L -> last))
   {
     printf("\n非法位置!\n");
     return 0;
   }
  printf("\n第%d个位置的数字是%d\n", i, L -> data[i - 1]);
}

int locate_sqlist (sqlistTp *L, int x)
{
  int i = 1;
  while ((i <= L -> last) && (L -> data[i - 1] != x))
    i++;
  if (i <= L -> last)
    printf("\n您要找的数在第%d个位置.\n", i, i);
  else
    printf("\n查无此数!\n");
}

int delete_sqlist (sqlistTp *L, int i)
{
  int j;
  if ((i < 1) || (i > L -> last))
    {
      printf("\n非法位置!\n");
      return 0;
    }
  for (j = i + 1; j < L -> last; j++)
    L -> data[j - 2] = L -> data[j - 1];
  L -> last = L -> last - 1;
}
[/code:1]
 楼主| 发表于 2004-5-19 12:24:32 | 显示全部楼层
以下程序编译成功,但运行结果出错。能帮我看看是哪里出错了。好吗

[code:1]
/*栈的链接实现*/

#include <stdio.h>

typedef struct node
{
  int data;
  struct node *next;
} LStackTp;

int main()
{
  LStackTp ls;
  int input;
  int i = 0;
  int outnum;
  InitStack(&ls);
  printf("请输入一些数字:");
  scanf("%d", &input);
  while (input != 0)
    {
      Push(&ls, input);
      scanf("%d", &input);
    }
  GetTop(&ls, &input);
  printf("\n当前栈顶的数为:%d\n", input);
  printf("请输入要出栈的个数:");
  scanf("%d", &outnum);
  printf("依此出栈的数为:");
  while (i < outnum)
    {
      Pop(&ls, &input);
      printf("%d ", input);
      i ++;
    }
  printf("\n当前栈的排列:");
  while (! EmptyStack(&ls))
    {
      Pop(&ls, &input);
      printf("%d ", input);
    }
  printf("\n\n");
}

int InitStack(LStackTp *ls)
{
  ls = NULL;
  return (1);
}

int Push(LStackTp *ls, int x)
{
  LStackTp *p;
  p = (LStackTp *) malloc (sizeof(LStackTp));
  p -> data = x;
  p -> next = ls;
  ls = p;
}

int Pop(LStackTp *ls, int *x)
{
  LStackTp *p;
  if (ls != NULL)
    {
      p = ls;
      *x = p -> data;
      ls = ls -> next;
      free(p);
      return 1;
    }
  else
    return 0;
}

int EmptyStack(LStackTp *ls)
{
  if (ls == NULL)
    return (1);
  else
    return (0);
}

int GetTop(LStackTp *ls , int *x)
{
  if (ls != NULL)
    {
      *x = ls -> data;
      return 1;
    }
  else
    return 0;
}
[/code:1]
回复

使用道具 举报

发表于 2004-5-19 13:46:23 | 显示全部楼层
哥们贴错地方了。

另,你的c语言我看要重学了。犯的全是基本概念错误。

例如你那个栈的实现里:
[code:1]
int InitStack(LStackTp *ls)
{
  ls = NULL;
  return (1);
}
[/code:1]
这是个没有任何意义的操作。
[code:1]
int Push(LStackTp *ls, int x)
{
  LStackTp *p;
  p = (LStackTp *) malloc (sizeof(LStackTp));
  p -> data = x;
  p -> next = ls;
  ls = p;
}
[/code:1]
我想你的意思是想追加完后ls指向新元素。可结果是除了新节点指向就节点外,
ls的值不会有任何影响。

正确写法应该是
[code:1]
main (){
...
LStackTp *p;

Push (&p, 1234);
...
}
[code]
int Push(LStackTp **ls, int x)
{
  LStackTp *p;
  p = (LStackTp *) malloc (sizeof(LStackTp));
  p -> data = x;
  p -> next = *ls;
  *ls = p;
}
[/code]

[/code:1]
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-8 08:59 , Processed in 0.038907 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

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