عملایت روی لیست پیوندی؟ساختمتن داده

-Mitra

Member
سلام دوستان یه سوال دارم

ما یه لیست پیوندی داریم که یه سری عدد از ورودی میگیره و به ترتیب وردوی نمایش میده
حالا اگه بخواهیم موقع نمایش اعداد به صورت بر عکس نمایش بده بایداز چه روشی استفاده کرد
ایا بدون استفاده از لیست های 2 طرفه امکان داره برنامه رو نوشت ؟

کد:
#include<iostream.h> 
#include<conio.h> 
struct node{ 
int info; 
node *next;}; 
void main(){ 
clrscr(); 
node *t,*start=NULL,*p,*q; 
int k,a,x; 
cout<<"Enter Number :"; 
cin>>a; 
while(a!=0){ 
t=new node[1]; 
t->info=a; 
if(start==NULL){ 
start=t; 
p=start;} 
else{ 
(*p).next= t; 
p= p->next;} 
cout<<"Enter a :"; 
cin>>a;} 
p->next=NULL; 
//cout<<"x :"; 
//cin>>x; 
p=start ; 
k=0; 
while(p!=NULL){ 
//if(p->info==x) 
//k++; 
cout<<p->info; 
p=(*p).next; 
p=p->next;} 
//if(k==0) 
//cout<<"not found ! "; 
//else 
//cout<<"count = "<<k; 
p=start; 
  
  
  
  
while(p!=NULL){ 
q=p; 
p=q->next; 
delete q;} 
getch(); 
}
 

the_king

مدیرکل انجمن
سلام دوستان یه سوال دارم

ما یه لیست پیوندی داریم که یه سری عدد از ورودی میگیره و به ترتیب وردوی نمایش میده
حالا اگه بخواهیم موقع نمایش اعداد به صورت بر عکس نمایش بده بایداز چه روشی استفاده کرد
ایا بدون استفاده از لیست های 2 طرفه امکان داره برنامه رو نوشت ؟

یا سطر بالایی یا سطر پایینی، یکی شون باید حذف بشه، دو تا شون یک کار رو دوبار انجام می دهند :
کد:
p=(*p).next; 
p=p->next;}

می توانید نتیجه رو بصورت معکوس در یک رشته ذخیره کنید :
کد:
#include <iostream.h>
#include <conio.h>
#include <string.h>

struct node
{
    int info;
    node *next;
};

int main()
{
    clrscr();
    node *t, *start = NULL, *p, *q;
    int a;
    while (1 == 1)
    {
        cout << "Enter Number :";
        cin >> a;
        if (a == 0)
            break;
        t = new node[1];
        t -> info = a;
        t -> next = NULL;
        if (start == NULL)
        {
            start = t;
            p = start;
        }
        else
        {
            p -> next = t;
            p = p -> next;
        }
    }
    p = start ;
    char text[1000] = "", temp[1000];
    while (p != NULL)
    {
        sprintf(temp, "%d", p -> info);
        strcat(temp, text);
        strcpy(text, temp);
        p = p -> next;
    }
    cout << text;
    p = start;
    while (p != NULL)
    {
        q = p;
        p = q -> next;
        delete q;
    }
    getch();
}
 

-Mitra

Member
ممنون بابت کد من با TC کامپایل کردم خطا میده 1 دونه
function sholud have a poroto type

نمیشه همین برنامه خودم رو درت کرد؟؟؟ اگه بشه رو همون اجرا بشه خیلی بهتر میشه ممنون
 

the_king

مدیرکل انجمن
ممنون بابت کد من با TC کامپایل کردم خطا میده 1 دونه
function sholud have a poroto type

نمیشه همین برنامه خودم رو درت کرد؟؟؟ اگه بشه رو همون اجرا بشه خیلی بهتر میشه ممنون

باید خطا مربوط به sprintf باشه به این دلیله که شما stdio.h رو در کدتان include نکرده اید. کد پیوستی با ++Turbo C کاملا
سازگار است : linklist.zip
 

پیوست ها

  • linklist.zip
    14.7 کیلوبایت · بازدیدها: 7

-Mitra

Member
خیلی ممنون اجرا شد
یه سوال دیگه نمیشه کد اول خودم رو یه کاری کرد اجرا بشه ؟ اخا من بعضی از دستوراتی که شما استفاده کردی هنوز نخوندم اگه بشه اون اولی اجر بشه یه دنیا ممنون میشم...این برنامه هم حرف نداره دستت درد نکنه خیلی کمکم کرد

برنامه خودمو این رو بهش اضافه کردم

کد:
void print_reverse_list(node start)
{
    if (start !=NULL)
    {
        print_reverse_list(start->link); //recursive
        cout<<start->info;  //output info of node
    }
}

یه خطا سین تکس عرور داره پیداش نمیکنم میشه شما تست کنید ؟
 

-Mitra

Member
بعد ممنون میشم یع توضیحی در مورد این تیکه ها بدی

کد:
 }
    p = start ;
    char text[1000] = "", temp[1000];
    while (p != NULL)
    {

و

کد:
sprintf(temp, "%d", p -> info);
	strcat(temp, text);
	strcpy(text, temp);
	p = p -> next;

و این دو کتاب بخانه برای چی هستن

#include <stdlib.h>
#include <stdio.h>
 
آخرین ویرایش:

the_king

مدیرکل انجمن
بعد ممنون میشم یع توضیحی در مورد این تیکه ها بدی

کد:
 }
    p = start ;
    char text[1000] = "", temp[1000];
    while (p != NULL)
    {

و

کد:
sprintf(temp, "%d", p -> info);
	strcat(temp, text);
	strcpy(text, temp);
	p = p -> next;

و این دو کتاب بخانه برای چی هستن

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

هدف اینکه که ابتدا رشته text خالی باشه و بعد یکی یکی مقدار هر کدام از خانه های لیست در سمت چپ
text اضافه شوند تا در انتها همه شون با ترتیب معکوس ثبت شده باشند. بصورت شبه کد چیزی شبیه به این :
کد:
text = p -> info + text
اما از آنجایی که text یک آرایه از نوع char است باید از توابع رشته ای استفاده کنیم.
strcat یک رشته را به سمت راست یک رشته دیگر اضافه می کند، اما به تنهایی برای منظور ما مناسب نیست چون
ما می خواهیم رشته به سمت چپ text اضافه شود، نه سمت راست. از آنجایی که تابع مناسبی وجود ندارد
باید به طریقی از strcat استفاده کنیم که نتیجه مورد نظر ما باشد. شبه کد آن چنین خواهد بود :
کد:
temp = p -> info
temp = temp + text
text = temp

یک آرایه char دیگر به نام temp ایجاد می کنیم که موقتا p -> info داخلش قرار بگیرد و سپس به سمت
راست temp رشته text را اضافه می کنیم و در انتها مقدار temp را در text کپی می کنیم. نتیجه این سه عملیات
اضافه شدن p -> info به سمت چپ text است. strcpy دستور کپی کردن آرایه رشته ای است.

از آنجایی که p -> info عدد است، باید ابتدا به رشته تبدیل شود. sprintf شبیه به printf یک عبارت را بصورت رشته
در می آورد اما به جای نمایش آن در خروجی، در یک آرایه char ذخیره اش می کند. از sprintf برای تبدیل p - > info
به رشته استفاده می کنیم.

تبدیل کردن p -> info به یک رشته در temp
کد:
sprintf(temp, "%d", p -> info);
اضافه کردن text به سمت راست temp
کد:
	strcat(temp, text);
کپی کردن temp به درون text
کد:
	strcpy(text, temp);

stdio.h یکی از کتابخانه های اصلی زبان ++C / C است که توابع مربوط به فایل ها و صفحه کلید و نمایشگر در داخلش
تعریف شده اند، sprintf هم در همین کتابخانه است.

در کتابخانه stdlib.h توابع مدیریت حافظه، تبدیل بین نوع داده های رشته ای و عدد ای، جستجو و مرتب سازی و ...
قرار دارند. itoa بصورت غیر استاندارد در این کتابخانه تعریف شده که می توانید بجای sprintf ازش استفاده کنید.
 

جدیدترین ارسال ها

بالا