PDA

View Full Version : سوال: مشکل در کار با ليست پيوندی



JoKer69
یک شنبه 19 اردیبهشت 1389, 14:03 عصر
سلام دوستان خسته نباشيد
سؤالم در رابطه با قسمتی از اين برنامس،ميخوام تابع اي پياده سازی کنم که با گرفتنه نام و نامه خانوادگی گره را از ليسته پيوندی حذف کنه.
نمونش رو با گرفتنه شماره دانشجويی نوشتم،ولی در نوشتن اين تابع مشکل دارم.
ممنون ميشم کمک کنيد.



#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
struct node {
friend class linkList;
char name[10];
char fname[21];
int stdno;
int majno;
node *next;
};
//******************
class linkList {
public:
linkList();
~linkList();
void addNode();
void delNode(int &);
void display();
private:
node *first;
node *last;
};
//*****************
linkList::linkList()
{
first = last = NULL;
}
//************
linkList::~linkList()
{
node *curPtr = first;
node *temp;
while(curPtr) {
temp = curPtr;
curPtr = curPtr -> next;
delete temp;
}
}
//*******************
void linkList:: delNode(int &no)
{
node *curPtr = first, *nextPtr = first ;
while(nextPtr) {
if(no == nextPtr -> stdno )
if (nextPtr == first) {
first = first -> next;
delete nextPtr;
break;
}
else {
if (nextPtr == last)
last = curPtr;
curPtr -> next = nextPtr -> next;
delete nextPtr;
break;
}
else {
curPtr = nextPtr;
nextPtr = nextPtr -> next;
}
}
}
//******************
void linkList::addNode()
{
node *newPtr = new node;
if(!newPtr) {
cout << "Allocation Failure";
getch();
}
newPtr -> next = NULL;
clrscr();
cout <<"Name :";
cout <<"\nFamily Name :";
cout <<"\nStudent Number :";
cout <<"\nMajor Number :";
gotoxy(7,1);
cin >> newPtr -> name;
gotoxy(14,2);
cin>>newPtr -> fname;
gotoxy(17,3);
cin >> newPtr -> stdno;
gotoxy(15,4);
cin >> newPtr -> majno;
if (first == NULL)
first = last = newPtr;
else {
last -> next = newPtr;
last = newPtr;
last -> next = first;
}
}
//****************
void linkList::display()
{
int r = 2;
clrscr();
cout << "Name "<<"Family Name "
<< "Student Number " << "Major Number ";
node *curPtr = first;
if( (curPtr -> name && curPtr -> stdno && curPtr -> majno)==NULL){
clrscr();
cout<<"List Is Empty";
}
else
{
while(curPtr) {
gotoxy(1, r);
cout << curPtr -> name;
gotoxy(10, r);
cout<<curPtr ->fname;
gotoxy(26,r);
cout << curPtr -> stdno;
gotoxy(45, r);
cout << curPtr -> majno;
r++;
curPtr = curPtr -> next;
if(curPtr==first){
break;
}
}
}
}
//**********
int menu();
int main()
{
int no;
char v;
linkList testList;
for (;;) {
clrscr();
switch(menu()) {
case 1: testList.addNode(); break;
case 2:
clrscr();
cout << "Enter S To Delete By Student Number.";
cout << "\nEnter N To Delete By Name And Family Name.";
cout << "\nEnter Your Choice:";
cin >> v;
if(v=='S'||'s'){
clrscr();
cout<<"Enter Student Number To Delete:";
cin>>no;
testList.delNode(no);
}
break;
case 3: testList.display();
getch();
break;
case 4: exit(1);
}
}
}
//*************
int menu()
{
int choice;
cout << "1. ENTER A STUDENT.\n"
<< "2. DELETE A STUDENT. \n"
<< "3. DISPLAY LIST.\n"
<< "4. END OF PROGRAM.\n";
cout << "\n Enter Your Select(1-4):";
cin >> choice;
return choice;
}

tdkhakpur
یک شنبه 19 اردیبهشت 1389, 16:47 عصر
از ساختار مناسبی استفاده نکردید ولی به نظرم قسمت حدف باید به شکل زیر باشد.(دستی کد میشود)


//*******************
void linkList:: delNode(int &no)
{
node *curPtr = first, *tmp=NULL;
bool deleted=false;
tmp = curPtr;
if( curPtr == first && no == curPtr -> stdno){
first = curPtr->next;
delete curPtr;
deleted = true;
}
curPtr = curPtr->next;
while(curPtr!=NULL && !deleted) {
if(no == curPtr -> stdno ){
tmp->next = curPtr -> next;
delete curPtr;
deleted = true;
}
tmp = curPtr;
curPtr = curPtr->next;
}
}

همیشه برای لیستهای پیوندی یک لینک برای نود قبلی قرار بدید وگرنه کدهای زیادی را برای نوشتن احتیاج خواهید داشت.

JoKer69
یک شنبه 19 اردیبهشت 1389, 18:07 عصر
ممنون از جوابتون دوست عزيز،قسمتی که گفته بوديد رو اصلاح کردم..
ولی فکر کنم متوجه منظورم نشديد...
ميخوام تابع اي به برنامه اضافه کنم که با گرفتنه نام و نام خانوادگی هم گره رو حذف کنه...
تو نوشتنه چنين تابع اي مشکل دارم....

tdkhakpur
یک شنبه 19 اردیبهشت 1389, 18:23 عصر
خب شما میتوانید یک تابع حذف به شکل زیر داشته باشید.


void linkList:: delNode(char *name, char *lastName)
{
node *curPtr = first;
bool Finded=false;
while(curPtr!=NULL && !Finded ){
if(strcmp(curPtr->name, name)==0 && strcmp(curPtr->fname, lastname)==0 ) ) {
delNode(curPtr->stdno)
Finded=true;
}
curPtr = curPtr-> next;
}
}

البته به یاد داشته باشید که باید همیشه اخر رشته هایتان به 0 ختم بشود

JoKer69
یک شنبه 19 اردیبهشت 1389, 23:21 عصر
متشکرم از کمکتون.