数据结构链表的讲解及代码实现!3

#include <iostream>
//链表
using namespace std;
typedef struct elemType {
int elemNo;
string elemName;
struct elemType * next;
}elemType,*node;
typedef struct head {
int length;
node next;
}lkListHead;
void initList(lkListHead &head){
cout<<endl<<"初始成功!"<<endl;
head.next = NULL;
head.length = 0;
}
int isPok(lkListHead &head){
cout<<"请输入要操作的位置:";
int p = 1;
cin>>p;
if(p>=1&&p<=head.length){
return p;
}
cout<<"输入的位置不合法!";
return -1;
}
void cleanList(lkListHead &head){
while(head.next){
node p = head.next;
head.next = p->next;
if(p){
cout<<"删除了结点: "<<p->elemNo<<endl;
delete p;
}
}
head.length = 0;
}
void allList(lkListHead &head) { //遍历数据
node p = head.next;
cout<<endl<<"遍历结果如下:"<<endl;
cout<<"elemNo"<<" "<<"elemName"<<endl;
while(p){
cout<<p->elemNo<<" "<<p->elemName<<endl;
p=p->next;
}
p = head.next;
cout<<"当前数据个数为:"<<head.length<<"个"<<endl;
cout<<"head->";
while(p){
cout<<p->elemNo<<"->";
p=p->next;
}
cout<<"^"<<endl;
}
void addList(lkListHead &head, node elem) {//增,头插法
if(elem){
node p = NULL;
p = head.next;
head.next = elem;
elem->next = p;
head.length++;
head.next->elemNo=head.length;//动态改变序号
cout<<"添加成功!"<<endl;
}
}
node setAndGetEmem(int elemNo, string elemName) {
node t = new elemType;
if(t == NULL){
cout<<"内存分配失败!"<<endl;
return t;
}
t->elemNo = elemNo;
t->elemName = elemName;
return t;
}
void delList(lkListHead &head) {//删
int pos = isPok(head);
if(pos == - 1){
cout<<"删除失败!";
return;
}
else {
if(pos == 1){
node t = head.next;
head.next=t->next;
cout<<"删除了结点: "<<t->elemNo<<endl;
delete t;
head.length--;
}
else{
node p = head.next;
for(int i = 1; i<pos-1;i++)
p = p->next;
node t = p->next;
p->next=t->next;
if(t){
cout<<"删除了结点: "<<t->elemNo<<endl;
delete t;
head.length--;
}
}
}
}
void changeList(lkListHead &head) {//改
int pos = isPok(head);
if(pos == -1){
cout<<"失败!";
return;
}
else{
node p = head.next;
for(int i = 1; i<pos;i++)
p = p->next;
cout<<"原编号为: "<<p->elemNo<<" 请输入要修改的编号:"<<endl;
cin>>p->elemNo;
cout<<"原名称为: "<<p->elemName<<" 请输入要修改的名称:"<<endl;
cin>>p->elemName;
cout<<"修改成功!"<<endl;
}
}
node getList(lkListHead &head) {//查
node t;
int pos = isPok(head);
if(pos == -1){
cout<<"失败!";
return t;
}
else{
node p = head.next;
for(int i = 1; i<pos;i++)
p = p->next;
cout<<"查询成功查询结果为:"<<endl;
cout<<"编号为: "<<p->elemNo<<endl;
cout<<"名称为: "<<p->elemName<<endl;
return p;
}
}
void menu (){
cout<<endl<<"\n1.初始化&清除链表\n2.增加数据\n3.删除数据\n4.修改数据\n5.查询数据\n6.遍历数据\n7.清除数据\n8.退出"<<endl;
cout<<"请输入选项: "<<endl;
}
int main() {
lkListHead head; //声明头结点
while(1){
menu();
int choice = 1;
cin>>choice;
switch(choice){
case 1:initList(head);//初始化
break;
case 2:addList(head, setAndGetEmem(1, "test")); //增
break;
case 3:delList(head); //删
break;
case 4:changeList(head); //改
break;
case 5:getList(head); //查
break;
case 6:allList(head); //遍历数据
break;
case 7:cleanList(head); //清除数据
break;
case 8:cout<<"已退出!!";return 0;
default: cout<<"输入有误!"<<endl;
}
}
return 0;
}