前面定义了两个类,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<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl;
cout<<endl;
cout<<" 欢迎进入学生信息管理系统——春荣"<<endl;
cout<<endl;
cout<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<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;
}