JiaWei Lee Ответов: 3

Реализовать строку АДТ


String * subStr(String *s, int start, int end)
возвращает срез s начиная с
начало индекса до и без учета конца индекса.
Выражение и ожидание вывода

ubStr(newStr("abcdefgh"), 2, 10)	cdefgh	
subStr(newStr("abcdefgh"), 2, 6)	cdef	
subStr(newStr("abcdefgh"), 0, 20)	abcdefgh


Что я уже пробовал:

Но когда я запускаю свой код,
я получаю
bcdefgh
bcde
""

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

typedef struct ListNode{
    int item;
    struct ListNode *next;
}ListNode;

typedef struct String {
    int size;
    ListNode head;
} String; //put the new list head inside the first list

ListNode *new_char_node(char c){ //create a new list node
    ListNode *n = (ListNode *)malloc(sizeof(ListNode));
    n -> item = c;
    n -> next = NULL;
    
    return n;
}

String *newStr(char *c){
    String *s = (String *)malloc(sizeof(String));
    ListNode *p = &s->head; //access the head address by put the &
    
    while(*c){
        p->next=new_char_node(*c++);
        p=p->next;
        s->size++;
    }
    
    return s;
}
String * subStr(String *s, int start, int end){
    
    char buff[end-start+1];
    ListNode *sp=&s->head;
    
    int i, j = 0;
    for (i = 0; i < end && sp != NULL; i++){
        if(i>=start){
            buff[j++]  = sp->item;
        } // move to the start, read the item, put into the buffer
        
        sp = sp->next;
        
    }
    
    
    printf("%s\n", buff);
    return  newStr(buff);
}


int main()
{
    subStr(newStr("abcdefgh"), 2, 10);
    subStr(newStr("abcdefgh"), 2, 6);
    subStr(newStr("abcdefgh"), 0, 20);
}

CPallini

Почему вы используете список понравившихся, где последовательности символов просто достаточно? Это обязательно?

JiaWei Lee

это упражнение по связанному списку. не мог понять, что пошло не так

3 Ответов

Рейтинг:
2

OriginalGriff

Это ваше домашнее задание, и заставить его работать - это часть задачи-самая сложная и интересная часть, на самом деле!

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
2

JiaWei Lee

если хотите распечатать subString() результат, правильно ли это использовать printf("%s\n", buff);. Заметил, что он будет включать дополнительную память, когда выход будет короче, чем исходная выделенная память
subStr(newStr("abcdefgh"), 2, 6) - cdef\376

String * subString( String * src, int start, int end)
{
    char buff[end-start+1];
    CharNode *cn=src->head;
    
    int i, j = 0;
    for (i = 0; i < end && cn != NULL; i++){
        if(i>=start){
            buff[j++]  = cn->c;
        } // move to the start, read the item, put into the buffer
        
        cn = cn->next;
        
    }
    printf("%s\n", buff);
    return newString(buff);
}


Рейтинг:
0

CPallini

Когда имеешь дело с распределением памяти, нужно быть очень осторожным. Кроме того память освобождение с этим тоже надо разобраться. В следующем коде я предоставляю newString и deleteString функции, а также subString функция подпись Вы должны заполнить его правильным кодом (используйте newString в качестве моделей).

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

typedef struct CharNode
{
  char c;
  struct CharNode * next;
} CharNode;

typedef struct String
{
  CharNode * head;
} String;

void deleteString( String * string);

String * newString( const char * s)
{
  if ( ! s ) 
    return (String *) 0;

  String * string =  (String *) malloc( sizeof (String));
  if ( ! string ) return string;

  string->head = (CharNode* ) 0;

  CharNode * cnprev = (CharNode*) 0;

  while ( *s )
  {
    CharNode * cn = (CharNode * ) malloc( sizeof(CharNode) );
    if (! cn )
    {
      deleteString( string );
      return (String*) 0;
    }
    if ( ! string->head )
      string->head = cn;

    cn->c = *s;
    cn->next = (CharNode * ) 0;
    if ( cnprev )
      cnprev->next = cn;
    cnprev = cn;
    ++s;
  } 
  return string;
}

void deleteString( String * string)
{
  if ( ! string ) return;

  if ( string->head)
  {
    CharNode * cn;
    do
    {
      cn = string->head;
      CharNode * cnprev = (CharNode *) 0;
      while ( cn->next )
      {
        cnprev = cn;
        cn = cn->next;
      }
      if (cnprev)
        cnprev->next = (CharNode *) 0;

      free(cn);
    } while ( cn != string->head);
  }
  free(string);
}

String * subString( String * src, int start, int end)
{
  // your code here
}