کد لیست پیوندی c++
اصلیترین موضوعی که در ساختمان داده ممکن است به آن برخورید مسائل مربوط به لیست پیوندی است. در این نوشته کدهای مربوط به لیست پیوندی یک طرفه و دوطرفه را برای شما به اشتراک میگذاریم. این کدامها به زبان سی پلاس پلاس ارائه شده است.
پیشنهاد نویسنده: کتاب آموزش سی پلاس پلاس
کد لیست پیوندی c++
لیست پیوندی چیست؟
لیست یوندی یا Linked List یک نوع ساختمان دادهای است که با کمک اشارهگرها پیاده سازی میشود؛ لیست پیوندی در دو نوع یک طرفه و دو طرفه است. در لیست پیوندی های یک طرفه تنها به خانهی بعدی از لیست اشاره گر وجود دارد ولی در لیست پیوندیهای دوطرفه دسترسی به عنصر قبلی نیز امکان پذیر است. اطلاعات بیشتری را از لیست پیوندی در ویکی پدیا بخوانید.
کد لیست پیوندی یک طرفه
#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
using namespace std;
void main()
{
struct node
{
int data;
struct node *next;
};
struct node *start, *p;
p = start = (struct node*) malloc(sizeof(node));
cin >> start->data;
/*for (int i = 0; i < 5; i++)
{
cout << p->data << endl;
p = p->next;
}*/
for (int i = 0; i < 4; i++)
{
p->next = (struct node*) malloc(sizeof(node));
p = p->next;
cin >> p->data;
p->next = NULL;
}
cout << endl << "Result ::" << endl;
p = start;
while (p != NULL)
{
cout << p->data << endl;
p = p->next;
}
}
جستجو در لیست پیوندی یک طرفه
#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
using namespace std;
void main()
{
struct node
{
int data;
struct node *next;
};
struct node *start, *p;
p = start = (struct node*) malloc(sizeof(node));
cin >> start->data;
for (int i = 0; i < 4; i++)
{
p->next = (struct node*) malloc(sizeof(node));
p = p->next;
cin >> p->data;
p->next = NULL;
}
cout << "Please Enter Number Search : ";
int x;
cin >> x;
int errr = 0;
cout << endl << "Result ::" << endl;
p = start;
for (int i = 0; i < 5; i++)
{
if (x == p->data)
{
cout << p->data << " - Search Item - " << " id : " << i + 1 << endl;
errr = 1;
break;
}
else
{
errr = 0;
}
p = p->next;
}
if (errr == 0)
{
cout << " Not Found :D " << endl;
}
}
کد لیست پیوندی دو طرفه
#include "stdafx.h"
#include "iostream"
using namespace std;
struct node
{
int data;
struct node *next;
struct node *last;
};
struct node *p, *start, *q;
class Node
{
public :
void create(int a,int b)
{
p = start = (struct node*)malloc(sizeof(node));
if (b == 1)
{
start->data = a;
start->last = NULL;
}
else
{
p->next = (struct node*)malloc(sizeof(node));
p->next->last = p;
p->next->data = a;
p = p->next;
}
}
void add(int a,int b)
{
while (p->data != a)
{
p = p->next;
}
q = (struct node*)malloc(sizeof(node));
q->next = p->next;
q->data = b;
p->next = q;
p->next->last = p->last;
}
void del(int a)
{
p = q = start = (struct node*)malloc(sizeof(node));
if (start->data == a)
{
start = start->next;
start->last = NULL;
free(p);
}
else
{
while (p->data != a && p->next != NULL)
{
q = p;
p = p->next;
}
q->next = p->next;
p->next->last = q;
free(p);
}
}
void view()
{
p = start = (struct node*)malloc(sizeof(node));
cout << start->data;
for (int i = 1; i < 10; i++)
{
cout << p->data;
}
}
};
void main()
{
int x;
Node n1;
cout << "Please Enter Number :";
cin >> x;
cout << endl;
n1.create(x, 1);
for (int i = 1; i < 10; i++)
{
cin >> x;
cout << endl;
n1.create(x, 2);
}
cout << "ADD 6 After 8" << endl;
n1.add(8, 6);
cout << "Delete 8" << endl << endl;
n1.del(8);
cout << "View List :";
n1.view();
}
اگر نیاز به آموزش ویدیویی سی پلاس پلاس دارید روی این لینک کلیک کنید. اگر کدهای بهتری در اختیار دارید در بخش نظرات برای ما ارسال کنید.



















آیا روش بهینهتری برای جستجو در لیست پیوندی وجود داره یا همین حلقه ساده بهترین راهه؟
حلقه ساده بهترین و رایجترین روش برای جستجو در لیست پیوندی یکطرفه است. در لیستهای دوطرفه نیز میتوان از همین روش استفاده کرد.
برای پروژههای واقعی، استفاده از لیست پیوندی بهتره یا vector و array مناسبترن؟
برای پروژههایی که اندازه دادهها از قبل مشخص نیست و نیاز به درج و حذف مکرر عناصر داریم، لیست پیوندی انعطافپذیری بیشتری دارد. اما اگر اندازه دادهها مشخص است و دسترسی سریع به عناصر بر اساس اندیس مهم است، vector و array گزینههای بهتری هستند.
این کدها روی کامپایلرهای جدید مثل GCC 13 بدون مشکل اجرا میشه؟
بله، این کدها با کامپایلرهای جدید GCC نیز سازگار هستند و باید بدون مشکل اجرا شوند.
آیا بهتره برای پیادهسازی لیست پیوندی از struct استفاده کنیم یا class انتخاب بهتریه؟
هر دو روش قابل استفاده هستند، اما استفاده از `class` معمولاً انعطافپذیری و قابلیت نگهداری بیشتری را برای پیادهسازی لیست پیوندی فراهم میکند.
برای لیست پیوندی دوطرفه مدیریت حافظه راحتتره یا یک طرفه؟
در لیست پیوندی دوطرفه، مدیریت حافظه کمی پیچیدهتر است زیرا نیاز به مدیریت اشارهگرهای `next` و `last` دارید. اما این پیچیدگی امکان دسترسی و حذف آسانتر عناصر را فراهم میکند.
تفاوت استفاده از struct و class در این پیاده سازی چیه؟
سلام، در این پیادهسازی، استفاده از `struct` و `class` تفاوت چندانی نداره، چون هر دو برای تعریف نوع دادهای با اعضای دادهای و تابعی استفاده شدن. تفاوت اصلی در دسترسی پیشفرض اعضا است که در `struct` عمومی و در `class` خصوصی است.
آیا میشه لیست پیوندی حلقوی (Circular Linked List) رو هم با همین کدها پیاده سازی کرد؟
با سلام. بله، با کمی تغییرات در کدها، میتوان لیست پیوندی حلقوی را نیز پیادهسازی کرد. این تغییرات شامل اتصال آخرین گره به اولین گره در لیست میشود.
در لیست دوطرفه چه زمانی دسترسی سریعتر از لیست یکطرفه میشه؟
سلام آتوسا، دسترسی سریعتر در لیست دوطرفه زمانی اتفاق میافتد که نیاز به پیمایش به سمت عقب (عناصر قبلی) داشته باشیم، یا بخواهیم عنصری را از وسط لیست حذف کنیم.
پیچیدگی زمانی جستجو در لیست پیوندی چه تفاوتی با آرایه داره؟
با سلام. پیچیدگی زمانی جستجو در لیست پیوندی در بدترین حالت O(n) است، در حالی که در آرایه (اگر مرتب نباشد) هم O(n) است، اما اگر آرایه مرتب باشد، می توان با جستجوی دودویی به پیچیدگی زمانی O(log n) رسید.
چطور میشه تابعی برای حذف عنصر در لیست یکطرفه نوشت؟
سلام نگین عزیز، برای حذف عنصر در لیست پیوندی یکطرفه، باید ابتدا عنصر مورد نظر را پیدا کنید و سپس با تغییر اشارهگرها، آن را از لیست حذف کنید. میتوانید از یک حلقه برای پیمایش لیست و مقایسه مقادیر استفاده کنید.