Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2012, 19:20   #1
nikitasnv
Новичок
Джуниор
 
Регистрация: 02.07.2012
Сообщений: 4
По умолчанию Однонаправленный список Си

Доброго времени суток!
Помогите исправить программу на си.Задание: Однонаправленный список, удалить все положительные значения кроме последнего.
Код:
#include <iostream.h>
#include <conio.h>
#define N 4
struct List
{ int data;
  List* next;};
  List *root,*q,*p;
  void main()
  {
  int i;
  root=new List;
  root->next=NULL;
  root->data=10;
  q=root;
  cout <<"vvedite chisla:";
  cin >>q->data;
  for (i=1; i<N; i++)
  {
   q->next=new List;
   q=q->next;
   q->next=NULL;
   }
   while (q!=0)
  { if (q>0)
    q=q->next;}
   if(q!=NULL)
   {*p=*q;
   delete q;}

   q=root;
   while (q!=NULL)
   {
   cout <<"result:"<<q->data;
   q=q->next;
   }
   getch();
   }
nikitasnv вне форума Ответить с цитированием
Старый 02.07.2012, 19:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

С потолка:
Код:
List* prev; q=root;
while (q!=0) { 
 if (q->data>0 && q->next){
  if(prev) prev->next=q->next;
  delete q;
 } else prev=q;
 q=q->next;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.07.2012, 20:15   #3
nikitasnv
Новичок
Джуниор
 
Регистрация: 02.07.2012
Сообщений: 4
По умолчанию

спасибо помощь, но выводит неверные значения
nikitasnv вне форума Ответить с цитированием
Старый 02.07.2012, 20:49   #4
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Цитата:
Сообщение от nikitasnv Посмотреть сообщение
Доброго времени суток!
Помогите исправить программу на си.Задание: Однонаправленный список, удалить все положительные значения кроме последнего.
Код:
#include "stdio.h"
#include "stdlib.h"


struct List{
	int key;
	List *next;
};

List *add(List *root, int key)
{
	List *temp;
	if (root == NULL)
	{
		root = (List*)malloc(sizeof(List));
		root->key = key;
		root->next = NULL;
		return root;
	}
	else
	{
		temp = root;
		while (temp->next != NULL)
			temp = temp->next;
		temp->next = (List*)malloc(sizeof(List));
		temp->next->key = key;
		temp->next->next = NULL;
		return root;
	}
}

List *del(List *root)
{

	List *prev = NULL, *curr = root, *point = NULL, temp;
	while (curr != NULL)
	{
		if (curr->key > 0)
			point = curr;
		curr = curr->next;

	}
	curr = root;
	prev = root;
	if (point == NULL) return root;
	while (curr != point)
	{
		if (curr == prev && curr->key > 0)
		{
			curr = curr->next;
			free(root);
			root = curr;
			prev = curr;
		}
		else 
			if (curr != prev && curr->key > 0)
			{
				prev->next = curr->next;
				free(curr);
				curr = prev->next;
			}
			else 
			{
				prev = curr;
				curr = curr->next;
			}

	}
	return root;

}
int main()
{
	List *l = NULL;
	l = add(l, -1);
	l = add(l, 2);
	l = add(l, 3);
	l = add(l, -4);
	l = add(l, 5);
	l = del(l);
	return 0;
}
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 02.07.2012, 20:59   #5
nikitasnv
Новичок
Джуниор
 
Регистрация: 02.07.2012
Сообщений: 4
По умолчанию

Last, спасибо за помощь, но я пытаюсь запустить эту массивную прогу в C++ Builder 6 и выдается ошибка в памяти, пытался запустить в BC 3, ничего не происходит, а попроще поменять мой код нельзя?
nikitasnv вне форума Ответить с цитированием
Старый 02.07.2012, 21:10   #6
Last
В прострации
Форумчанин
 
Регистрация: 13.01.2009
Сообщений: 239
По умолчанию

Хз, я твой код не смотрел =). Попробуй дебажить, логика там простая.
Код:
List *prev = NULL, *curr = root, *point = NULL, temp;
	while (curr != NULL)//находим последний положительный элемент в списке
	{
		if (curr->key > 0)
			point = curr;
		curr = curr->next;

	}
	curr = root;
	prev = root;
	if (point == NULL) return root;  //если не нашли положительных элементов - выходим.
	while (curr != point)
	{
		if (curr == prev && curr->key > 0) //удаляем корневой элемент
		{
			curr = curr->next;
			free(root);
			root = curr;
			prev = curr;
		}
		else 
			if (curr != prev && curr->key > 0) //удаляем элемент в середине списка
			{
				prev->next = curr->next;
				free(curr);
				curr = prev->next;
			}
			else                                     //ничего не удаляем, переходим к следующему элементу
			{
				prev = curr;
				curr = curr->next;
			}

	}
	return root;
P.S. На экране ничего происходить и не должно, я не писал функцию вывода на экран.
Пол-жизни сидючи, в монитор глядючи...
Last вне форума Ответить с цитированием
Старый 02.07.2012, 21:13   #7
nikitasnv
Новичок
Джуниор
 
Регистрация: 02.07.2012
Сообщений: 4
По умолчанию

Вот работающая версия проги
Код:
#include <iostream.h>
#include <conio.h>
#define N 4
struct List
{ int data;
List* next;};
List *root,*q,*p, *t;
void main()
{
    int i;
    q=new List;
    cout <<"vvedite chisla:";
    cin >>q->data;
    root = q;
    for (i=1; i < N; i++)
    {
        q->next=new List;
        q = q ->next;
        cin >>q->data;      
        q->next=NULL;
    }
    q = root;
    cout <<"Data:";
    while (q!=NULL)
    {
        cout <<" "<<q->data;
        q=q->next;
    }
    q = root;
    t = q;
    while (q ->next != NULL)
    { 
        if (q ->data > 0){
            if (q == root)
                root = q->next;
            p = q -> next;
            t ->next = p -> next;
            delete q;   
            q = p;
            t = q;
        }
        else{
            t = q;
            q=q->next;
        }
    }   
    q = root;
    cout << "\nresult:";
        while (q!=NULL)
        {
            cout <<" "<<q->data;
            q=q->next;
        }
    getch();
}
nikitasnv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
однонаправленный список Arthur92 Общие вопросы C/C++ 5 03.07.2011 20:51
однонаправленный список Nata-Tata Помощь студентам 3 14.04.2011 11:28
линейный однонаправленный список с++ kate311893 Общие вопросы C/C++ 0 07.12.2010 10:02
линейный однонаправленный список с++ kate311893 Помощь студентам 0 06.12.2010 20:30
[C] Однонаправленный список ordoss Помощь студентам 8 30.01.2010 14:43