Πως μπορω να το κανω να τυπωνει κυκλικη λιστα

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
theophilos9077
Δημοσιεύσεις: 1
Εγγραφή: 30 Απρ 2015 09:47

Πως μπορω να το κανω να τυπωνει κυκλικη λιστα

Δημοσίευση από theophilos9077 » 30 Απρ 2015 09:54

Κώδικας: Επιλογή όλων

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

#define SIZE 10          
#define NUM_PER_LINE 6  

typedef struct node
&#123;
   char name&#91;SIZE&#93;;   
   struct node * next;
&#125; CListNode;

int read_positive_integer&#40;char *msg&#41;;
void go_to_pause&#40;&#41;;
char *get_name&#40;char *a&#41;;
CListNode *insert_at_end&#40;CListNode *first,CListNode *end_ptr, char a&#91;SIZE&#93;&#41;;
CListNode *initiate&#40;int n&#41;;
CListNode *delete_next_node&#40;CListNode *end_ptr, CListNode *p&#41;;
void print_list&#40;CListNode *end_ptr&#41;;
CListNode *select&#40;CListNode *end_ptr, int k&#41;;

int main&#40;&#41;
&#123;
   int num, k , n;
   CListNode *list_end_ptr, *ptr;
   printf&#40;"Selecting a Person from a Set of Persons\n"&#41;;
  
   n = read_positive_integer&#40;"number of persons"&#41;;
  
   list_end_ptr = initiate&#40;n&#41;;
   print_list&#40;list_end_ptr&#41;;
   k = read_positive_integer&#40;"number of persons to skip"&#41;;
   ptr = select&#40;list_end_ptr, k&#41;;
   printf&#40;"\nThe person selected is&#58; %s\n", ptr->name&#41;;
   printf&#40;"\nEnd of program.\n"&#41;;
   go_to_pause&#40;&#41;;
   return&#40;0&#41;;
&#125;
                                          	
int read_positive_integer&#40;char *msg&#41;
&#123;
   int h;
   do
   &#123;
    
      printf&#40;"\nType the %s&#58; ", msg&#41;;
      scanf&#40;"%d", &h&#41;;
      if &#40;h <= 0&#41;
      &#123; 
         printf&#40;"The %s must be positive.\n", msg&#41;;
      &#125;
   &#125; while &#40;h <= 0&#41;;
   return&#40;h&#41;;
&#125;

void go_to_pause&#40;&#41;
&#123;
   char ch;
   while &#40;scanf&#40;"%c",&ch&#41; != EOF && ch != '\n'&#41;;
   printf&#40;"\nPress ENTER to continue . . . "&#41;;
   getchar&#40;&#41;;
&#125;
             
char *get_name&#40;char *a&#41;
&#123;
   char format&#91;10&#93;;
   sprintf&#40;format, "%%%ds", SIZE-1&#41;;
   scanf&#40;format, a&#41;;
   return a;
&#125;
                
CListNode *insert_at_end&#40;CListNode *first,CListNode *end_ptr, char *a&#41;
&#123;
 CListNode *temp, *head=NULL;
 head=first;
 temp=&#40;CListNode *&#41; malloc&#40;sizeof&#40;CListNode&#41;&#41;;
 end_ptr->next=temp;
 strcpy&#40;temp->name, a&#41;;
 temp->next=head;

 return temp;
&#125;

CListNode *initiate&#40;int n&#41; 
&#123;
 CListNode *end, *first=NULL,*ptr=NULL;
 int i;
 char new_name;
 first=&#40;CListNode *&#41; malloc&#40;sizeof&#40;CListNode&#41;&#41;;
 if &#40;first==0&#41; &#123;
    printf&#40;"Allocation error...\n"&#41;;
    exit&#40;0&#41;; &#125;
 first->next=end;
 for &#40;i=0; i<n; i++&#41; &#123;
    if &#40;i<1&#41; &#123;
        printf&#40;"Enter the name of the %d person&#58; ", i+1&#41;;
        get_name&#40;&new_name&#41;;
        strcpy&#40;first->name, &new_name&#41;;
        first=end;
    &#125;
    else
    &#123;
        printf&#40;"Enter the name of the %d person&#58; ", i+1&#41;;
        get_name&#40;&new_name&#41;;
        first=insert_at_end&#40;first,end, &new_name&#41;;
        first->next=end;
    &#125;
 &#125;
 return end;
&#125;

void print_list&#40;CListNode *end_ptr&#41;
&#123;
 int i;
 CListNode *str_ptr , *first,*ptr=0;
 if &#40;end_ptr == NULL&#41;
    printf&#40;"\n List is empty"&#41;;
 else
 &#123;
    str_ptr = end_ptr->next;
    while &#40;str_ptr !=  end_ptr&#41;
    &#123;
        printf&#40;"%s->", str_ptr->name&#41;;
        str_ptr = str_ptr->next;
        i++;
    &#125;
    printf&#40;"%s->\n", str_ptr->name&#41;;
 &#125;
&#125;

CListNode *delete_next_node&#40;CListNode *end_ptr, CListNode *p&#41;
&#123;
	CListNode *name;  
   if &#40;end_ptr == NULL&#41; &#123;
      fprintf&#40;stderr, "Empty list\n"&#41;;
      exit&#40;1&#41;;
   &#125;
	 p = &#40;end_ptr&#41;->next;
   end_ptr = end_ptr->name;
if &#40;p == end_ptr&#41;   

      end_ptr = NULL;
else
      &#40;end_ptr&#41;->next = p->next;

   free&#40;p&#41;;
   return end_ptr;	
&#125;

CListNode *select&#40;CListNode *end_ptr, int k&#41;
&#123;
	CListNode *p , *ptr;
int i;
int n=5;
for &#40;i=0; i<n; i++&#41;
&#123;
	delete_next_node&#40;end_ptr,p&#41;;
	
	print_list&#40;end_ptr&#41;;
&#125;
return end_ptr;
&#125;

Η μονη βοηθεια για να μπορεσω να παω παρακατω ειναι που ακριβως κανω λαθος και δε τυπωνει κυκλικα τη λιστα. Οπως καταλαβατε αυτο που θελω ειναι οταν τυπωνει να τυπωνει τη λιστα απο το πρωτο μεχρι το τελευταιο στοιχειο και ξανα το πρωτο αλλα να ισχυει κιολας οχι μονο εκτυπωση. Εχω σπασει το κεφαλι μου πολλες μερες τωρα αλλα δε βγαζω ακρη.
Σας ευχαριστω εκ των προτερων.

gvre
Δημοσιεύσεις: 990
Εγγραφή: 14 Οκτ 2010 11:34
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Πως μπορω να το κανω να τυπωνει κυκλικη λιστα

Δημοσίευση από gvre » 30 Απρ 2015 13:42

Ο κώδικας που έστειλες δε δουλεύει μια χαρά, δεν κάνει καν compile (χτυπάει στην ονομασία τής συνάρτησης select) και έχει λάθη. Θα σου πρότεινα να απλοποιήσεις τον κώδικα, να ενεργοποιήσεις τα warnings και τα debug symbols, να κάνεις compile ξανά και να διορθώσεις τα λάθη.
Σχετικά με το ερώτημά σου, ψάξε για απλά συνδεδεμένη κυκλική λίστα ή circular linked list, αν εννοείς αυτό.

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες