listas enlazadas - ver error

Iniciado por Choclito, 24 Agosto 2009, 22:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Choclito

1.- hola quiero que me ayuden porque me vota mi error .porque cuando quiero trabajar con tipo string me vota un error
ERROR:no se puede adquirir la direccion,obtener el tamaño ni declarar un puntero a un tipo administrado.
pero cuando trabajo con double , int  normal trabaja quisiera que me ayuden ah analizar.

2.- es necesario liberar memoria aqui en el C# como en el c++ free(nodo) una checadita mi codigo gracias


Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication7
{
    public unsafe class Program
    {         
        public struct Nodo
        {
            public string Nombre;
            public int Valor;
            public Nodo* siguiente;
        }
        static void Main(string[] args)
        {
            int op;
            Nodo* Lista;
            Lista = null;
            while (true)
            {
                Console.Clear();
                Console.WriteLine("1.-Ingresar Datos");
                Console.WriteLine("2.-Eliminar Datos");
                Console.WriteLine("3.-Mostrar Datos");
                Console.WriteLine("4.-Salir");
                Console.Write("Ingresa Opcion:");
                op = int.Parse(Console.ReadLine());
                Console.Clear();
                if (op == 1)
                {
                    Console.Write("Ingresa Edad:");
                    int v = int.Parse(Console.ReadLine());
                    Console.Write("Ingresa Nombre:");
                    string nom = Console.ReadLine();
                    Nodo* anterior;
                    //Se crea un nodo llamado Q
                    //y se le asigna espacio en memoria
                    Nodo* nuevo = stackalloc Nodo[1];
                    nuevo->Valor = v;
                    nuevo->Nombre = nom;
                    if (Lista == null)
                    {
                        nuevo->siguiente = Lista;
                        Lista = nuevo;
                    }
                    else
                    {
                        anterior = Lista;
                        while (anterior->siguiente != null)
                        {
                            anterior = anterior->siguiente;
                        }
                        nuevo->siguiente = anterior->siguiente;
                        anterior->siguiente = nuevo;
                    }
                }
                else if (op == 2)
                {
                    Nodo* Q;
                    Nodo* T=stackalloc Nodo[1];
                    if (Lista == null)
                        Console.WriteLine("Lista Vacia");
                    else
                    {
                        if (Lista->siguiente == null)
                            Lista = null;
                        else
                        {
                            Q = Lista;
                            while (Q->siguiente != null)
                            {
                                T = Q;
                                Q = Q->siguiente;
                            }
                            T->siguiente = null;
                            //free(Q);//Como hago esto en el C#
                            //como libero memoria
                        }
                        Console.WriteLine("Dato Eliminado");
                    }
                }
                else if (op == 3)
                {
                    Nodo* nodo;
                    if (Lista == null)
                        Console.WriteLine("Lista Vacia");
                    else
                    {
                        nodo = Lista;
                        while (nodo != null)
                        {
                            Console.Write("{0},{1}->", nodo->Valor,nodo->Nombre);
                            nodo = nodo->siguiente;
                        }

                    }
                }
                else if (op == 4)
                    System.Environment.Exit(0);
                string z = Console.ReadLine();
            }
        }
    }
}

Choclito

la solcuion ah la pregunta 2

RECOLECCION DE BASURA

como los objetos se asignan dinamicamente , cuando estos objetos se destruyen sera necesrio verficar que la memoria ocupada por ellos ha queado liberada para usos posteriores. El procedimiento de liberacion es distinto segun el tipo de lenguaje Utilizado.

En C++
los objetos asignados dinamicamente se deben liberar utilizando un operador free o delete. Por el contrario Java y C# tienen un enfoque diferente. Manejan la liberacion de memoria de modo automatico la tecnica que utilizan se dedomina recoleccion de basura (garbage collection). Su funcionamiento es el sigueinte cuando no existe ninguna refrencia a un objeto, se supone que ese objego ya no se necesita, y la memoria ocupada por ese objeto puede ser recuperada(liberada). NO hay necesidad de destrir objetos explicitamente como hace
C++.La recoleccion de basura solo ocurre esporadicamente dureçante la ejecucion de su programa. No sucede simplemente porque los objetos dejen de ser utilizados.

Skeletron

Has una cosa:
Dinos cuando te da el error.. si cuando quieres agregar datos.. borrarlos.. modificarlos.. que?.. o no puedes compilarlo?? o que??
copianos el error exactamente como dice.. dinos la linea y todo elllo...

raul338

Estas usando C# como si fuera C++ y no es asi...

Si bien en C# se pueden usar punteros, no se usan de esa manera. La asignacion de memoria es automatica, debes lidiar con eso ;)

Ahora no tengo mucho tiempo, pero a la tarde te dare practicamente lo que quieres pero en visual basic .net, asi te dejo el simple trabajo de convertirlo a C# ;)


(no te imaginas lo que fue para hacer una lista doblemente enlazada en vb.net  :o)


Saludos