Budowanie posortowanej listy jednokierunkowej

0

siema!
tworzę program do budowania posortowanej listy oto kod :

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

struct el
{
	struct el *nast;
	int klucz;
};

typedef struct el elListy;
typedef elListy *lista;


void new_begin(lista *li,int n)
{
	lista nowy=malloc(sizeof(elListy));
	nowy->klucz=n;
	nowy->nast=(*li);
	(*li)=nowy;
}

void new_after(lista *li,int n)
{
	lista nowy=(li);
	printf("\njestem przed while\n");
	if(!nowy->nast)
		{
		printf("\njestem w 1w\n");
		while(n<nowy->klucz )
			nowy=nowy->nast;
		}
	else
		while(n<nowy->klucz && n>=nowy->nast->klucz)
			{
				printf("\njestem w 2 warunku \n");
				nowy=nowy->nast;
			}
	printf("\njestem po while\n");
	lista el=malloc(sizeof(elListy));
	el->nast=(*li)->nast;
	(*li)->nast;
	(*li)->nast=el;
	el->klucz=n;
	//(*li)=nowy;
}

void add_el(lista *li)
{
	lista ll = *li;
	int spr=1;
	while (spr==1)
	{
		printf("wpisz element do listy: \n");
		int buff;
		scanf("%d",&buff);
		if (!(*li) || (*li)->klucz > buff)
		{
			printf("\nwszedlem do warunku z new begin\n ");
			new_begin(li, buff);
		}
		else
		{
			printf("\nwszedlem do warunku z new after \n");
			new_after(li,buff);
		}
		printf("\nwskaznik jest ustawiony na  %d\n",(*li)->klucz);
		printf("czy chcesz wejsc ponownie? [1/0]");
		scanf("%d",&spr);
	}

}

void wysw(lista head)
 {
 	if(head!=NULL)
    {
        printf("%d\n",head->klucz);
		wysw(head->nast);
    }
}

int main()
{
	lista nowa=NULL;
	add_el(&nowa);


	wysw(nowa);
    return 0;
}

wiem kod jest jak jeden wielki bajzel ale na razie chciałbym żeby program działał potem napisze go jeszcze raz. Już nawet zorientowałem się gdzie jest błąd, wydaje mi się że w funkcji

new_after()

w else jest while(n<nowy->klucz && n>=nowy->nast->klucz)

i tu warunek jest zły bo program przeskakuje tylko za pierwszy element listy i w sumie nie wiem  jak go zmienić ... jakieś sugestie ? :P będę wdzięczny za pomoc :)
1

To co zrobiłeś nadaje się wyłącznie do kosza, powinno to wyglądać mniej więcej tak:

#include <stdio.h>
#include <stdlib.h>
 
typedef struct el
  {
   struct el *next;
   int key;
  } node, *pnode, **list;
 
 
pnode new_one(int key,pnode next)
  {
   pnode newone=malloc(sizeof(node));
   newone->key=key;
   newone->next=next;
   return newone;
  }
 
void new_after(list lst,int key)
  {
   while((*lst)&&(key>(*lst)->key)) lst=&((*lst)->next);
   *lst=new_one(key,*lst);
  }

void add_nodes(list lst)
  {
   for(;;)
     {
      printf("wpisz element do listy (!-koniec): ");
      int key;
      if(scanf("%d",&key)==1) new_after(lst,key);
      else if(getchar()=='!') break;
      while(getchar()!='\n') {}
     }
  }
 
void show(list lst)
  {
   pnode i;
   for(i=*lst;i;i=i->next) printf("%d\n",i->key);
  }
 
int main()
  {
   pnode lst=NULL;
   add_nodes(&lst);
   show(&lst);
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1