لیست پیوندی یک طرفه غیرحلقوی دارای هدر
چند ترم پیش …
سر کلاس ساختمان داده یه پروژه لیست پیوندی معرفی کرد که چون زمان تحویلش مصادف با زمان امتحان اردوها بود من زودتر نوشتمش تا مشکلی پیش نیاد. بعد دو ترم که داشتم نگاه می کردم چیز زیادی از +cc یادم نمی یومد! ولی بالاخره این پروژه رو نوشتم. حالا سوال و پروژه نوشته شده رو واستون می ذارم، یه نگاهی بهش بندازین تا اگه مشکلی داره بگین درسش کنم. دوشنبه می خوام تحویلش بدم.
لیست پیوندی یک طرفه غیرحلقوی دارای هدر (header)طراحی کرده و در هر نود (node) لیست، اطلاعات دانشجویی شامل نام، نام خانوادگی، شماره دانشجویی و جنسیت را نگهداری کنید. اعمال زیر برای این لیست پیوندی مورد نیاز است:
* اضافه کردن یک دانشجو به لیست پیوندی
* حذف کردن یک دانشجو از لیست پیوندی
* حذف کردن یک دانشجو با داشتن شماره دانشجویی
* نمایش لیست دانشجویان
این پروژه لیست پیوندی تحویل داده شد و من ساختمان داده رو تو قزوین 16.5 شدم…
سورس رو می تونید توی ادامه مطلب بخونید و یا برای دانلود پروژه لیست پیوندی ساختمان داده کلیک کنید.
/*****************************************************************************/
/* Data Structure Project v1.0 */
/* This simple program managing information by linked list. */
/* in this program you can add, delete and show student data. */
/* */
/* Programming by */
/* Javad Evazzadeh Kakroudi 870382401 */
/*****************************************************************************/
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <cstring>
#include <iomanip>
using namespace std;
int menu(); // show user interface menu
int tmp; // temp variable!
/*** ------------- declaration student linked list class ------------- ***/
class slinkedlist
{
private:
typedef struct student
{ // declaration student struct with 4 variable & 1 pointer
char id[10]; // store student id
char name[15]; // store student name
char family[20]; // store student family
bool gender; // true=male : false=female
student *next; // store next node address(link)
}; // end student struct
typedef student *nodeptr; // create new type: "nodeptr"
nodeptr header, footer; // create header & footer
public:
slinkedlist(); // constructor
int nodecounter; // node counter
void add_student(bool first); // declaration function of class
void add_first(char[],char[],char[],bool);
void add_last(char[],char[],char[],bool );
void remove_first();
void remove_by_id();
void remove_by_name();
void remove_by_family();
void show_list();
bool confirm(char[],char[],char[],bool,int);
}; // end student linked list class
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ----------------------------- main ------------------------------ ***/
int main()
{
slinkedlist mydb; // create mydb as slinkedlist
for( ; ; ) // unceasing loop !
{
switch (menu()) // run menu function
{
case 1:
mydb.add_student(true); // run add_student function
break;
case 2:
mydb.add_student(false); // run add_student function
break;
case 3:
mydb.remove_first(); // run remove_first function
break;
case 4:
mydb.remove_by_id(); // run remove_by_id function
break;
case 5:
mydb.remove_by_name(); // run remove_by_name function
break;
case 6:
mydb.remove_by_family(); // run remove_by_family function
break;
case 7:
mydb.show_list(); // run show_list function
break;
case 65:
case 8:
system("cls"); // clear screen
system("color 3e"); // change text color to aqua
cout<<"\n Programming by"<<endl<<endl<<endl;
cout<<"\t\t\tJavad Evazzadeh";
getch(); // show programmer data & pause
return 0; // return Exit_Success
default:
system("color 0b"); // change text color to aqua
cout<<"\a\t\t incorrect!"; // beep and show message
system("color 07"); // switch to default color
} // end switch
} // end for
} // end main
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ---------------------- show menu for user ----------------------- ***/
int menu()
{ // show menu for user to choose commands
system("cls"); // clear screen
cout<<"This simple program managing information by linked list."<<endl;
cout<<"in this program you can add, delete and show student data\n"<<endl;
cout<<"1. Add student in front of list(stack)"<<endl;
cout<<"2. Add student in rear of list(queue)\n---"<<endl;
cout<<"3. Delete student"<<endl;
cout<<"4. Delete student by student id"<<endl;
cout<<"5. Delete student by student name"<<endl;
cout<<"6. Delete student by student family\n---"<<endl;
cout<<"7. show students\n---"<<endl;
cout<<"8. Exit"<<endl<<endl;
cout<<"\t\t]\ryour choice [ ";
return (getche()-48);
} // in previous line: give user chioce and chage it from ascii to number
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** -------------------------- constructor -------------------------- ***/
slinkedlist::slinkedlist()
{
header = NULL; // copy null in header
footer = header; // copy header in footer
nodecounter = 0; // reset nodecounter
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ------------------------- add to first -------------------------- ***/
void slinkedlist::add_first
(char myid[],char myname[],char myfamily[],bool mygender)
{ // insert a new node at the header of the list
if(confirm(myid,myname,myfamily,mygender,1))
{
nodeptr current; // create newpointer as student
current = new student;
// give student space and assign it to current
strcpy(current->id,myid); // ......................... //
strcpy(current->name,myname); // copy data entered by the //
strcpy(current->family,myfamily); // user to current->data //
current->gender=mygender; // ````````````````````````` //
current->next = header; // assign headerto curent->link
header = current; // equate header with current
if (nodecounter == 0) footer = current;
// if there was no node, equate footer with current
nodecounter++; // counter++
}
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** -------------------------- add to last -------------------------- ***/
void slinkedlist::add_last
(char myid[],char myname[],char myfamily[],bool mygender)
{ // insert a new node to the footer of the list
if(confirm(myid,myname,myfamily,mygender,1))
{
nodeptr current; // create newpointer as student
current = new student;
// give student space and assign it to current
strcpy(current->id,myid); // ......................... //
strcpy(current->name,myname); // copy data entered by the //
strcpy(current->family,myfamily); // user to current->data //
current->gender=mygender; // ````````````````````````` //
current->next = NULL; // assign NULL to current->link
if (nodecounter == 0) header = current;
// if there was no node, equate header with current
else footer->next = current; // else footer->link = current
footer = current; // equate footer with current
nodecounter++; // counter++
}
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ----------------------- remove from first ----------------------- ***/
void slinkedlist::remove_first()
{ // remove first node from the list
nodeptr current; // create new pointer as student
current = header; // equate current with header
if (nodecounter == 0) // if there was no node
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: there is no item to remove!";
getch(); // show above message and pause
system("color 07"); // switch to default color
}
else // else run below commands
{
if(confirm(current->id,current->name,current->family,current->gender,2))
{
header = current->next; // assign current->next toheader
delete current; // delete current(target)
nodecounter--; // counter--
if (nodecounter == 0) footer = header;
}
} // in previous line: if there was no node, equate footer with header
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** --------------------- special remove by id ---------------------- ***/
void slinkedlist::remove_by_id()
{ // remove special node by using id from the list
char targetid[10]; // for storing student id
bool available = false; // for check available
nodeptr current, target; // create new pointer as student
current = header; // equate current with header
if (nodecounter == 0) // if there was no node
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: there is no item to remove!";
getch(); // show above message and pause
system("color 07"); // switch to default color
}
else // else run below commands
{
cout<<endl<<"enter student id to delete from list: ";
cin.getline(targetid,10); // give id from user
cin.clear(); // clear the error bits
cin.sync(); // synchronize the input buffer
if ((strcmp (header->id,targetid))==0) // if first id equal target id
remove_first(); // delete first node in list
else // else run below commands
{
for( ; ;current=current->next) // locate node before the target
{
if(current->next==NULL) break; // if current->link==null, break
if(strcmp(current->next->id,targetid)==0)
{ // if user entered id equal current->link->id
available = true; // change available status
break; // and break loop
}
} // end loop and locate target-1
if (available) // if user entered id available
{// show confirmation and after confirm delete target node
target = current->next;
if(confirm(target->id,target->name,target->family,target->gender,2))
{ // if user confirm run below commands
current->next = target->next; // correct link
delete target; // delete target
nodecounter--; // counter--
if (nodecounter == 0) footer = header;
}
}// if id available compiler run above command else run below!
else
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: your input id is not exist!";
getch(); // show message and pause
system("color 07"); // switch to default color
}
} // end inside else
} // end outside else
} // end remove_by_id function
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** -------------------- special remove by name --------------------- ***/
void slinkedlist::remove_by_name()
{ // remove special node by using name from the list
char targetname[10]; // for storing student name
bool available = false; // for check available
nodeptr current, target; // create new pointer as student
current = header; // equate current with header
if (nodecounter == 0) // if there was no node
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: there is no item to remove!";
getch(); // show above message and pause
system("color 07"); // switch to default color
}
else // else run below commands
{
cout<<endl<<"enter student name to delete from list: ";
cin.getline(targetname,10); // give name from user
cin.clear(); // clear the error bits
cin.sync(); // synchronize the input buffer
if((strcmp(header->name,targetname))==0)// if firstname equal targetname
remove_first(); // delete first node in list
else // else run below commands
{
for( ; ;current=current->next) // locate node before the target
{
if(current->next==NULL) break; // if current->link==null, break
if(strcmp(current->next->name,targetname)==0)
{ // if user entered name equal current->link->name
available = true; // change available status
break; // and break loop
}
} // end loop and locate target-1
if (available) // if entered name available
{// show confirmation and after confirm delete target node
target = current->next;
if
(confirm(target->id,target->name,target->family,target->gender,2))
{ // if user confirm run below commands
current->next = target->next; // correct link
delete target; // delete target
nodecounter--; // counter--
if (nodecounter == 0) footer = header;
}
}// if name available compiler run above command else run below!
else
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: your input name is not exist!";
getch(); // show message and pause
system("color 07"); // switch to default color
}
} // end inside else
} // end outside else
} // end remove_by_name function
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** -------------------- special remove by family --------------------- ***/
void slinkedlist::remove_by_family()
{ // remove special node by using family from the list
char targetfamily[10]; // for storing student family
bool available = false; // for check available
nodeptr current, target; // create new pointer as student
current = header; // equate current with header
if (nodecounter == 0) // if there was no node
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: there is no item to remove!";
getch(); // show above message and pause
system("color 07"); // switch to default color
}
else // else run below commands
{
cout<<endl<<"enter student family to delete from list: ";
cin.getline(targetfamily,10); // give family from user
cin.clear(); // clear the error bits
cin.sync(); // synchronize the input buffer
if // if family equal targetfamily
((strcmp(header->family,targetfamily))==0)
remove_first(); // delete first node in list
else // else run below commands
{
for( ; ;current=current->next) // locate node before the target
{
if(current->next==NULL) break; // if current->link==null, break
if(strcmp(current->next->family,targetfamily)==0)
{ // if user entered family equal current->link->family
available = true; // change available status
break; // and break loop
}
} // end loop and locate target-1
if (available) // if entered family available
{// show confirmation and after confirm delete target node
target = current->next;
if
(confirm(target->id,target->name,target->family,target->gender,2))
{ // if user confirm run below commands
current->next = target->next; // correct link
delete target; // delete target
nodecounter--; // counter--
if (nodecounter == 0) footer = header;
}
}// if family available compiler run above command else run below!
else
{
system("color 0f"); // change color to bright white
cout <<endl<< "\a\t\t\tERROR: your input family is not exist!";
getch(); // show message and pause
system("color 07"); // switch to default color
}
} // end inside else
} // end outside else
} // end remove_by_family function
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ------------------------- show the list ------------------------- ***/
void slinkedlist::show_list()
{ // show all data of the list
nodeptr current; // create new pointer as student
current = header; // equate current with header
system("cls"); // clear screen & show messages
system("color 0e"); // change text color to yellow
cout<<"now in this list you can see all information of ";
cout<<nodecounter<<" student!"<<endl<<endl;
cout<<"Record\tStudentID\tName\t\tFamily\t\t\tGender"<<endl;
cout<<"------\t---------\t----\t\t------\t\t\t------"<<endl<<endl;
for(int i=1; current!=NULL; current=current->next, i++)
{ // in this loop we show the data of list, form first to last
cout<<" "<<right<<setfill('0')<<setw(4)<<i<<"\t";
cout<<setfill(' ')<<left<<setw(9)<<current->id<<"\t";
cout<<setw(10)<<current->name<<"\t"<<setw(20)<<current->family<<"\t";
cout<<(current->gender ? "male" :"female")<<endl;
} // in previous line: if gender value is true, show male else show female
cout<<endl<<endl<<endl; // new line
cout<<"press any key to continue...";
getch(); // show above message and pause
system("color 07"); // switch to default color
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ----------------------- confirmation ------------------------- ***/
bool slinkedlist::confirm
(char myid[],char myname[],char myfamily[],bool mygender, int permission)
{ // confirmation data (0=only show, 1=add, 2=delete)
cout<<endl<<endl<<"\t"; // new line
for(int i=0;i<63;i++) cout<<"-"; // show dash line
cout<<endl; // new line
cout<<"\t StudentID\tName\t\tFamily\t\t\tGender"<<endl;
cout<<"\t ---------\t----\t\t------\t\t\t------"<<endl;
cout<<"\t "<<setfill(' ')<<left<<setw(9)<<myid<<"\t";
cout<<setw(10)<<myname<<"\t"<<setw(20)<<myfamily<<"\t";
cout<<(mygender ? "male" :"female")<<endl<<"\t";
// in previous line: if gender value is true, show male else show female
for(int i=0;i<63;i++) cout<<"-"; // show dash line
cout<<endl<<endl; // new line
switch(permission)
{ // in this switch we show related message for user
case 1:
system("color 0a"); // change screen color to green
cout<<"\tDo you want to add this record in list?"<<endl;
break;
case 2:
system("color 0c"); // change screen color to red
cout<<"\tDo you want to remove this record from list?"<<endl;
break;
default:
getch();
return false;
} // end switch
cout<<"\tpress (y) to confirm or another key to refuse>";
tmp = getch(); // player press a one key
system("color 07"); // switch to default color
if(tmp=='y') return true; // if user confirm return true
else return false; // else return false
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*** ------------- give data from user for adding to list ------------ ***/
void slinkedlist::add_student(bool first)
{ // give data from user one by one for adding to list by custom order
char newid[10]; // ......................... //
char newname[15]; // declaration //
char newfamily[20]; // variable //
bool newgender; // ````````````````````````` //
system("cls"); // clear screen
cout<<"Enter student data to add in database!"<<endl<<endl;
cout<<endl<<"ID: \t\t";
cin.getline(newid,10); // give id from user
cin.clear(); // clear the error bits for the cin input stream
cin.sync(); // synchronize the input buffer,
// discarding any leftover characters in the buffer
cout<<endl<<"Name: \t\t";
cin.getline(newname,20); // give name from user
cin.clear();
cin.sync();
cout<<endl<<"Family: \t";
cin.getline(newfamily,40); // give family from user
cin.clear();
cin.sync();
cout<<endl<<"\t]\t1.male\t2.female\rGender[";
for (;;) // unceasing loop !
{ // in next line: give user chioce and chage it from ascii to number
tmp = getch()-48; // 1=ture=male, 2=false=female
if(tmp==-35);
else
{
if (tmp==1) { newgender=true; cout<<tmp; break; }
else if (tmp==2) { newgender=false; cout<<tmp; break; }
else
{
system("color 0b"); // change text color to aqua
cout<<"]\a\t\t\t\toops!\tdont press "<<char(tmp+48)
<<" only 1 or 2\rGender["<<"\t]\t1.male\t2.female\rGender[";
system("color 07"); // switch to default color
}
}
}
// if first==true add to first of list else add to last of list
if (first) add_first(newid,newname,newfamily,newgender);
else add_last(newid,newname,newfamily,newgender);
}
/*** ````````````````````````````````````````````````````````````````````` ***/
/*****************************************************************************/
/* Programming by */
/* 870382401 Javad Evazzadeh Kakroudi */
/*****************************************************************************/
مرور 16 ديدگاه برای پروژه ساختمان داده: لیست پیوندی
دستتون درد نکنه…خییییلی دمتوووون گرم…
خواهش می کنم
واقعا دمت گرم
ممنونم
پایان ترم و اینترنت و پروژه و…
موفق باشی
faghat mitonam begam aali bod … : )
دوستانی که از این مدل مطالب استفاده می کنند، لازم به ذکر است که هدف من از قرار دادن این گونه مطالب آموزش هست و نه کمک به کپی کردن اون.
موفق باشی دوست من.
من تو سايتهاي مختلف سرچ مي كردم كه توسايت شما 50% جواب خودمو پيدا كردم.
در سايت شما يك پروژه ساختمان داده مربوط به ليست پيوندي قرار دارد مي خواستم از خود شما اگه ميشه كمك بگيرم دو گزينه به اين برنامه اضافه شود، و رنگ بندي برنامه را حذف كنم.
از شما، خيلي خيلي ممنون مي شوم اگه به من در اين زمينه كمك كنيد.
صورت سوال ،همانند صورت سوال پروژه شما مي باشد و علاوه بر آنها دو گزينه زير به برنامه اضافه شود
*مرتب كردن ليست به ترتيب حروف الفبا
*كپي كردن ليست دختر و پسر در دو ليست مجزا
*برنامه بصورت تك رنگ باشد.(يعني مثل برنامه شما هر دستور اجرايي يك رنگ مجزا نداشته باشد).
با توجه به اینکه تقریبا برای خط به خط این پروژه توضیح گذاشتم، فکر نمی کنم دیباگ کردنش سخت باشه، به هر حال برای حذف رنگ بندی انجام شده در این پروژه می تونید خطوطی رو که در اون ها از کد system(“color”); استفاده شده رو حذف کنید، مثلا system(“color 0b”); که اون دو حرف مربوط به رنگی هست که صفحه نمایش و نوشته های میگیره که می تونید با حدف اون ها نیاز سوم خودتون رو برطرف کنید.
برای نیاز اول و دوم هم واقعا فکر نمی کنم که کار سختی پیش رو داشته باشید. امیدوارم با کمی تلاش بتونید این دو نیاز رو به برنامه اضافه کنید!
Hi, I believe your blog could possibly be having browser
compatibility problems. When I take a look
at your web site in Safari, it looks fine however when opening in I.
E., it has some overlapping issues. I simply wanted to give you
a quick heads up! Besides that, great website!
mg halghavi nist? chera sharte payanesho gozashtin Null???? nabayad first bashe??to ghesmate namayesh manzorame
vayyyyyyyy mrc poroje in term mnm hamine khyli mamnoonm
سلام پروژه جستجوی دودویی یا الگورتیم خوندن فایل هم دارید که با همین لیست پیوندی باشه و بگه تو مقایسه اعداد رو پیدا میکنه
سلام داداش
من یه پروژه ی ساختمان داده دارم صورت سوالش اینه :
پروژه صف پیوندی: صف خودرو ها در نظربگیریید(کدخودرو۱۰۰تا۱۹۹,مدل خودرو۱تا۵)
۱_اضافه کردن خودرو به روش صف پیوندی
۲_حذف کردن خودرو.۳_اضافه کردن مشتری۴_حذف مشتری۵_مشاهده لیست خودرو ها۶_مشاهده لیست خودروها۷_تخصیص۸_خروج
میخواستم بدونم میشه از این کد ها استفاده کرد؟
سلام وقتتون بخیر بابت این سایت عالی ممنونم پروژه درسی بنده این سورس بود خیلی خیلی ممنونم بابت این لطف بزرگتون
سلام به کمکتون احتیاج دارم .یه سوال بابت ساختمان داده دارم .تو نت سرچ کرئم پیدا نکردم جواب سوالمو
باسلام
ببخشید من به راهنمایی شما نیازدارم من یک پروژه ای برای ساختمان داده ها باعنوان مدیر ومعاونانش میخاستم اما هرچی میگردم نمیتونم بهترینشو پیدا کنم بدلیل این بیماری هم دانشگاه نرفتیم که بهتر بفهمیم میشه شما کمکم کنین ممنون میشم
باتشکر