您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构课程中的c++实现的顺序表和链表

2011-09-16 22:47 746 查看
呵呵,老师布置的作业,自己写的奥!

顺序表:

#include <iostream>
#include <string>
using namespace std;
struct Data
{
int stationNum;
string name;
string time;
int personUpNum;
int personDownNum;
Data * next;
};

Data* LinkedlistInit()                 //初始化一个站点
{
Data * L = new Data;
if (L == NULL)
{
cout <<"没有足够的内存空间!"<<endl;
}
L->next = NULL;
return L;
}

int LinkedListLength(Data * L)        //求总站数
{
Data * p = new Data;
p = L->next;
int j = 0;
while(p)
{
j++;
p = p->next;
}
return j;
}

int LinkedListupPerson(Data * L)        //求总上车人数
{
Data * p = new Data;
p = L->next;
int j = 0;
while(p)
{
j += p->personUpNum ;
p = p->next;
}
return j;
}

Data * LinkedListInsert(Data * L,Data * p,Data e)   //插入新的站点
{
Data * pre = new Data;
pre = L;
while (pre && pre->next!=p)
{
pre = pre->next;
}
if (!pre)
{
cout <<"不存在*p结点!"<<endl;
exit(0);
}
Data * s= new Data;
s->name = e.name;
s->time = e.time;
s->stationNum = e.stationNum;
s->personUpNum = e.personUpNum;
s->personDownNum = e.personDownNum;
s->next = pre->next;
pre->next = s;
return L;
}

Data * LinkedListDel(Data * L,string name)     //删除一个站点
{
if (L->next == NULL)
{
cout <<"空表!"<<endl;
}
Data * pre = new Data;
pre = L;
while (pre->next && pre->next->name != name)
{
pre = pre->next;
}
if (pre->next==NULL)
{
cout <<"不存在该站名!"<<endl;
exit(0);
}
Data * s= new Data;
s = pre->next;
pre->next = s->next;
delete(s);
return L;
}

void Listtraversal(Data * L)     //遍历List
{
Data * p = new Data;
p = L;
while(p != NULL)
{
cout <<"号码 :"<<p->stationNum<<endl;
cout <<"站名 :"<<p->name<<endl;
cout <<"到达时间 :"<<p->time<<endl;
cout <<"上车人数 :"<<p->personUpNum<<endl;
cout <<"下车人数 :"<<p->personDownNum<<endl;
p = p->next;
}
}

string ListgetTime(Data * L , string name) //根据站名得到时间
{
Data * p = new Data;
p = L->next;
while(p->name != name)
{
p = p->next;
}
if (p != NULL)
{
return p->time;
}
else
{
cout <<"没有该站!"<<endl;
exit(0);
}
}

void ListgetprebyName(Data * L , string name)   //根据站名得到前一个站
{
Data * p = new Data;
Data * q = new Data;
q = L;
p = L->next;
while(p->name != name)
{
p = p->next;
q = q->next;
}
if (p != NULL && q != L)
{
cout <<"前一个站为:"<<q->name<<endl;
}
else
{
cout <<"没有该站!"<<endl;
}

}

void ListgetafterbyName(Data * L , string name)     //根据站名得到后一个站
{
Data * p = new Data;
p = L->next;
while(p->name != name)
{
p = p->next;
}
if (p != NULL && p->next != NULL)
{
cout <<"后一个站为:"<<p->next->name<<endl;
}
else
{
cout <<"没有该站!"<<endl;
}

}

int main()
{
Data  a;
a.name = "烟台大学";
a.time = "7";
a.personUpNum = 32;
a.personDownNum = 0;
a.stationNum = 1;
Data  b;
b.name = "工商学院";
b.time = "8";
b.personUpNum = 12;
b.personDownNum = 22;
b.stationNum = 2;
Data  c;
c.name = "清泉路";
c.time = "9";
c.personUpNum = 2;
c.personDownNum = 4;
c.stationNum = 3;
Data * header= new Data;
header = LinkedlistInit();
LinkedListInsert(header,header->next,a);
LinkedListInsert(header,header->next,b);
LinkedListInsert(header,header->next,c);
cout <<LinkedListLength(header)<<endl;
Listtraversal(header->next);
cout <<"总的上车人数 :"<<LinkedListupPerson(header)<<endl;
cout <<"根据name得到time :"<<ListgetTime(header,"烟台大学")<<endl;
ListgetprebyName(header,"工商学院");
ListgetprebyName(header,"清泉路");
ListgetprebyName(header,"烟台大学");
ListgetafterbyName(header,"工商学院");
ListgetafterbyName(header,"清泉路");
ListgetafterbyName(header,"烟台大学");
LinkedListDel(header,"烟台大学");
Listtraversal(header->next);
}


链表:

#include <iostream>
#include <string>
using namespace std;
struct Data
{
int stationNum;
string name;
string time;
int personUpNum;
int personDownNum;
};
class list
{
public:
int max;
static int length;
Data * data;
Data * p;
list(int m);
void initList(int st, string n, string t, int pu, int pd);  //初始化一个站并且插入
void deleteList(string n);                                  //删除一个站点
static int getLength();                                     //求总站数
int getpersonall();                                         //总上车人数
void getinformation();                                      //遍历各站(站名、到达时间、上下车人数)
string getTimebyname(string n);                             //查找第i站,根据站名查找到达该站的时间
void getprebystationName(string n);                         //已知某站,求该站的前一站
void getafterbystationName(string n);                       //已知某站,求该站的后一站
};
int list::length = 0;

int list::getLength()
{
return length;
}

void list::getprebystationName(string n)
{
int len = 0;
if (length == 0)
{
cout <<"空表!"<<endl;
return;
}
data = p;
while(data->name != n)
{
if (len >= (length-1))
{
break;
}
data++;
len++;
}
data--;
try
{
cout <<"号码 :"<<data->stationNum<<endl;
cout <<"站名 :"<<data->name<<endl;
cout <<"到达时间 :"<<data->time<<endl;
cout <<"上车人数 :"<<data->personUpNum<<endl;
cout <<"下车人数 :"<<data->personDownNum<<endl;
}
catch(int)
{cerr<<"error!";}
catch(string)
{cerr<<"error!";}
catch(Data *)
{cerr<<"error!";}
catch(...)
{cerr<<"查找的表中没有该站!"<<endl;}
}

void list::getafterbystationName(string n)
{
int len = length;
data = p;
while(data->name !=n)
{
if (len <= 0)
{
break;
}
data++;
len--;
}
if (len = 0)
{
cout <<"查找的表中没有该站名!"<<endl;
return ;
}
data++;
if (data++)
{try{
cout <<"号码 :"<<data->stationNum<<endl;
cout <<"站名 :"<<data->name<<endl;
cout <<"到达时间 :"<<data->time<<endl;
cout <<"上车人数 :"<<data->personUpNum<<endl;
cout <<"下车人数 :"<<data->personDownNum<<endl;
}
catch(...)
{cerr<<"查找的表中没有该站!"<<endl;}
}
}

string list::getTimebyname(string n)
{
int len = length;
data = p;
while(len > 0 )
{
if (data->name ==n)
{
break;
}
data++;
len--;
}
return data->time;
}

void list::getinformation()
{
int len = length;
data = p;
while(len > 0)
{
cout <<"号码 :"<<data->stationNum<<endl;
cout <<"站名 :"<<data->name<<endl;
cout <<"到达时间 :"<<data->time<<endl;
cout <<"上车人数 :"<<data->personUpNum<<endl;
cout <<"下车人数 :"<<data->personDownNum<<endl;
data++;
len--;
}
}

int list::getpersonall()
{
int personNumbers = 0;
int len = length;
data = p;
while (len >= 1)
{
personNumbers+=data->personUpNum;
data++;
len--;
}
return personNumbers;
}

list::list (int m)
{
this->max = m;
data = new Data[max];
p = data;
}

void list::initList(int st, string n, string t, int pu, int pd)
{
if (length == max + 1)
{
cout <<"插入的表满!"<<endl;
return;
}
if (st < 0|| st > max)
{
cout <<"插入位置出错!"<<endl;
return;
}
if (length == 0)
{
data = data + st;
data->stationNum = st;
data->name = n;
data->time = t;
data->personUpNum = pu;
data->personDownNum = pd;
length++;
}
else
{
int j = length;
for (; j > st;j--)
{
data[j].stationNum = data[j-1].stationNum;
data[j].name = data[j-1].name;
data[j].time = data[j-1].time;
data[j].personUpNum = data[j-1].stationNum;
data[j].personDownNum = data[j-1].personDownNum;
}
data[j].stationNum = st;
data[j].name = n;
data[j].time = t;
data[j].personUpNum = pu;
data[j].personDownNum = pd;
length++;
}
}

void list::deleteList(string n)
{
int len = 0;
if (length == 0)
{
cout <<"删除的为空表!"<<endl;
return;
}
data = p;
while(data->name != n)
{
if (len >= (length-1))
{
break;
}
data++;
len++;
}
if (len >= (length-1))
{
cout <<"当前要删除的表中没有该站名!"<<endl;
return ;
}
else
{
data = p;
while(len <(length - 1))
{
data[len].stationNum = data[len+1].stationNum;
data[len].name = data[len+1].name;
data[len].time = data[len+1].time;
data[len].personUpNum = data[len+1].stationNum;
data[len].personDownNum = data[len+1].personDownNum;
len++;
}
length--;
}
}

int main()
{
list list1(5);
list1.initList(0,"南寨","6",12,4);
list1.initList(1,"烟台大学","7",45,8);
list1.initList(3,"滨州医学院","9",7,21);
list1.initList(2,"工商学院","8",8,43);
list1.initList(2,"烟台山医院","4",4,1);
cout <<"length :"<<list1.getLength()<<endl;
cout <<"allnum :"<<list1.getpersonall()<<endl;
cout <<"遍历输出信息:"<<endl;
list1.getinformation();
cout <<"length :"<<list1.getLength()<<endl;
cout <<"根据name找出time :"<<list1.getTimebyname("烟台大学")<<endl;
cout <<"已知某站,求该站的前一站"<<endl;
list1.getprebystationName("南寨");
cout <<"已知某站,求该站的前一站"<<endl;
list1.getprebystationName("烟台大学");
cout <<"已知某站,求该站的后一站"<<endl;
list1.getafterbystationName("滨州医学院");
cout <<"已知某站,求该站的后一站"<<endl;
list1.getafterbystationName("烟台山医院");
cout <<"删除一个站点"<<endl;
list1.deleteList("工商学院");
cout <<"遍历输出信息:"<<endl;
list1.getinformation();
cout <<"length :"<<list1.getLength()<<endl;
cout <<"删除一个站点"<<endl;
list1.deleteList("月亮湾");
return 0;
}


以上的代码比较简陋,希望给大家指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息