问题描述
- 不知道为什么output()无法接收information这个对象,求大神指点
-
前面定义了两个类,Node类是LinkedList类的数据成员,主函数中不知道为什么output()无法接收information这个对象,求大神指点#include
#include
#include
using namespace std;
#include"string"class Node
{private:
Node * next;
public:
friend class LinkedList; long id; string name; string sex; string workplace; string telephone; string mail; Node(long id=0, string name="nothing", string sex="nothing", string workplace="nothing", string telephone="nothing", string mail="nothing",Node *next=NULL); void insertAfter(Node *p); Node *deleteAfter(); Node *nextNode(); void SetNext(Node *ptr) { next=ptr; }
};
Node::Node(long id, string name, string sex, string workplace, string telephone, string mail,Node *next):
id(id),name(name),sex(sex),workplace(workplace),telephone(telephone),mail(mail),next(next){}Node * Node::nextNode()
{
return next;
}void Node::insertAfter(Node *p)
{
p->next = next;next = p;
}
Node * Node::deleteAfter()
{
//定义tempPtr使函数可以返回删除的节点地址
Node * tempPtr = next;if(next == 0) return 0; next = tempPtr->next; return tempPtr;
}
class LinkedList {
private: //表头和表尾指针 Node *front, *rear; //记录表当前遍历位置的指针,由插入和删除操作更新 Node *prevPtr, *currPtr; //表中元素个数 int size; //当前元素在表中的位置序号,由函数reset()使用 int position; //释放节点 void freeNode(Node *p); //将链表L复制到当前表(假设当前为空) //被复制构造函数和operator=函数调用 void copy(const LinkedList &L); public: void print() { if(size=0||!currPtr) { cout<<"通讯录为空。"<<endl; exit(0); } else { cout<<setw(5); cout<<"学号"<<" "; cout<<setw(7); cout<<"姓名"<<" "; cout<<setw(7); cout<<"性别"<<" "; cout<<setw(10); cout<<"工作地点"<<" "; cout<<setw(12); cout<<"电话"; cout<<setw(15); cout<<"邮箱"<<endl; while(currPtr!=NULL) { cout<<setw(5); cout<<currPtr->id<<" "; cout<<setw(7); cout<<currPtr->name<<" "; cout<<setw(7); cout<<currPtr->sex<<" "; cout<<setw(10); cout<<currPtr->workplace<<" "; cout<<setw(12); cout<<currPtr->telephone<<" "; cout<<setw(15); cout<<currPtr->mail<<endl; currPtr = currPtr->next; } } } LinkedList(); LinkedList(const LinkedList &L); ~LinkedList(); LinkedList &operator =(const LinkedList &L); //生成新节点,数据域为item,指针域为ptrNext Node *newNode(long id=0, string name="nothing", string sex="nothing", string workplace="nothing", string telephone="nothing", string mail="nothing", Node *ptrNext=NULL); //返回链表中元素的个数 int getSize()const; //检查链表是否为空 bool isEmpty()const; //初始化游标位置 void reset(int pos=0); //使游标移动到下一个节点 void next(); //游标是否到链尾 bool endOfList()const; //返回游标当前位置 int currentPosition(void) const; //在表头插入节点 void insertFront(Node *p); //在表尾添加节点 void insertRear(Node *p); //在当前节点之前添加节点 void insertAt(Node *p); //在当前节点之后添加节点 void insertAfter(Node *p); //删除头结点 void deleteFront(); //删除当前节点 void deleteCurrent(); //清空链表:释放所有节点的内存空间。被析构函数和operator=调用 void clear();
};
//LinkedList.cpp
LinkedList::LinkedList():front(NULL),rear(NULL),prevPtr(NULL),currPtr(NULL),size(0),position(-1){};
LinkedList::LinkedList(const LinkedList &L){
copy(L);
}LinkedList::~LinkedList(){
clear();
}LinkedList & LinkedList::operator = (const LinkedList &L)
{
if(this!=&L)//与原来的比较
{
clear();copy(L); } return *this;
}
int LinkedList::getSize()const
{
return size;
}bool LinkedList::isEmpty()const
{
if(size==0)
return false;
else
return true;
}void LinkedList::freeNode(Node *p)
{
delete p;
}void LinkedList::copy(const LinkedList &L)
{
Node *ptr = L.front;currPtr=NULL; while(ptr) //遍历插入 { insertAfter(ptr); ptr=ptr->nextNode(); } if(position==-1)//空链表 return; prevPtr=NULL; currPtr=front; for(int pos=0;pos!=L.currentPosition();pos++) //遍历到结尾 { prevPtr=currPtr; currPtr=currPtr->nextNode(); } position=L.position; size=L.size;
}
//pos默认值为0
void LinkedList::reset(int pos)
{
int n;
//链表为空,直接退出
if(!front)
return;if(pos>=size||pos<0) //位置规范 { cout<<"reset:position error"<<endl; return; } if(pos==0) //默认将指针位置放在开头 { prevPtr=NULL; currPtr=front; position=0; } else//其他位置 { prevPtr=front; n=1; for(position=n;position!=pos;position++)//指针移动到pos位置 { prevPtr=currPtr; currPtr=currPtr->nextNode(); } }
}
void LinkedList::next()
{
if(currPtr)//判断是否为空链表
{
prevPtr=currPtr;
currPtr=currPtr->nextNode();
position++;
}
}bool LinkedList::endOfList()const
{
return (!currPtr);
}int LinkedList::currentPosition(void) const
{
return position;
}void LinkedList::insertFront(Node *p)
{if(front==NULL)
{
front=rear=p; size++;
}
else
{
p->next=front;front=p;
size++;
}
FILE *fp;
fp= fopen("通讯录.txt","w");
fwrite(p,sizeof(Node),1,fp);
fclose(fp);}
void LinkedList::insertRear(Node *p)
{
//链表为空
if(front==NULL){ front=rear=p; size++; }
else
{
rear->next=p; rear=p; size++;
}
FILE *fp; fp=fopen("通讯录.txt","a"); fwrite(p,sizeof(Node),1,fp); fclose(fp);
}
void LinkedList::insertAt(Node *p)
{
if(currPtr==front) insertFront(p); //在当前结点之前插入结点 else { p->next=currPtr; prevPtr->next=p; size++; } FILE *fp; fp= fopen("通讯录.txt","w"); fseek(fp, 0L, 0); fwrite(p, sizeof(Node), 1,fp);
}
void LinkedList::insertAfter(Node *p)
{
if(currPtr==rear){ insertRear(p); } else { p->next=currPtr->next; currPtr->next=p; size++; }
}
void LinkedList::deleteFront()
{
Node *ptr=front;
if(front) //判断是否为空链表
{
front=front->nextNode();
delete ptr;
size--;
}
else
{cout<<"This list is empty!"<<endl;
}
}void LinkedList::deleteCurrent()
{
Node *ptr;if(!currPtr) //空链表 { cout<<"This list is a empty!"<<endl; exit(1); } if(!prevPtr) //删除头结点 { ptr=front; front=front->nextNode(); } ptr=prevPtr->deleteAfter(); if(ptr==rear) //若删除的为表尾 { rear=prevPtr; position--; } currPtr = ptr->nextNode(); freeNode(ptr); size--;
}
void LinkedList::clear()
{
Node *ptr1,*ptr2;ptr1=front; while(ptr1) //遍历删除 { ptr2=ptr1->nextNode(); delete ptr1; ptr1=ptr2; } front=NULL; rear=NULL; prevPtr=NULL; currPtr=NULL; size=0; position=-1;
}
int main()
{long id; string name; string sex; string workplace; string telephone; string mail; cout<<endl<<" 333333333333333333333333333333333333333333333333333333333333"<<endl; cout<<endl; cout<<" 欢迎进入学生信息管理系统——春荣"<<endl; cout<<endl; cout<<" 333333333333333333333333333333333333333333333333333333333333"<<endl; cout<<endl; LinkedList information; Node *p =new Node(3,"春荣","男","华师","1234334424","123113123137@qq.com"); information.insertRear(p); p = new Node(2,"倩倩","女","华师","63716437823","1673646317@163.com"); information.insertFront(p);
void output(LinkedList list);
void change(LinkedList list);
void addup(LinkedList list);
void search(LinkedList list);int choice; while(1) { cout<<"请选择您需要的功能:"<<endl<<endl; cout<<"1——查看所有人信息"<<endl<<endl; cout<<"2——修改姓名跟电话号码"<<endl<<endl; cout<<"3——统计功能"<<endl<<endl; cout<<"4——由学号查询个人信息"<<endl<<endl;; cout<<"5——退出"<<endl<<endl; cout<<"请输入:"; cin>>choice; switch(choice) { case 1: cout<<"11"<<endl; output(information); //出现错误的地方 break; case 2: change(information); break; case 3: addup(information); break; case 4: search(information); break; case 5: break; default: cout<<"您的输入有误,重新输入。"<<endl<<endl; break; } if(5 == choice) break; }
return 0;
}void output(LinkedList list)
{cout<<"1"<<endl; list.print();
}
void change(LinkedList list)
{cout<<"Do you really want to change"<<endl;
}
void addup(LinkedList list)
{
cout<<"综合"<<endl;}
void search(LinkedList list)
{
cout<<"寻找"<<endl;
}