LinkList.h
#include#include #include #define OK 1 #define ERROR 0 typedef char ElemType; typedef int Status; using namespace std; typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int grade; //成绩 }Student; typedef struct LNode{ Student data; //结点数据域 struct LNode *next; //结点指针域 }LNode,*LinkList; //LinkList为指向结构体的LNode的指针类型 //初始化 Status InitList(LinkList &L){ //构造一个空的单链表L L = new LNode; //生成新的结点作为头结点,用头指针L指向头节点 L->next = NULL; //头结点的指针域置空 return OK; } //创建单链表--前插法 void CreateList_H(LinkList &L, int n){ int i, grade; char no[8], name[20]; for(i = 0; i < n; i++){ LNode *p = new LNode; cout << "请输入学生学号,姓名,成绩!" << endl; cin >> no >> name >> grade; strcpy(p->data.no, no); strcpy(p->data.name, name); p->data.grade = grade; p->next = L->next; L->next = p; } } //创建单链表--后插法 void CreatrList_R(LinkList &L, int n){ int i, grade; char no[8], name[20]; LNode *r = L; for(i = 0; i < n; i++){ LNode *p = new LNode; cout << "请输入学生学号,姓名,成绩!" << endl; cin >> no >> name >> grade; strcpy(p->data.no, no); strcpy(p->data.name, name); p->data.grade = grade; p->next = NULL; r->next = p; r = p; } } // //取值 LNode *GetElem(LinkList L, int i){ //在带头结点的单链表L中根据序号i获取元素的值,用e返回第i个数据元素的值 LNode *p = L->next; int j = 1; while(p&&jnext; ++j; } if(!p || j > i) return ERROR; return p; } // //查找 LNode *LocateElem(LinkList L, ElemType *e){ //在带头结点的单链表L中查找值为e的元素 LNode *p = L->next; while(p && strcmp(p->data.name,e) != 0){ p = p->next; } return p; } //统计表中学生个数 int Scount(LinkList L){ LNode *p = L->next; int count = 0; while(p){ count++; p = p->next; } return count; } // //插入 int ListInsert(LinkList &L, int i,Student stu){ //在带头结点的单链表L中第i个位置插入值为e的新结点 LNode *p = L; int j = 0; while(p && (j < i - 1)){ p = p->next; ++j; } if(!p || j > i - 1) return ERROR; LNode *s = new LNode; s->data = stu; s->next = p->next; p->next = s; return OK; } // //删除 int ListDelete(LinkList &L, int i){ //在带头结点的单链表L中,删除第i个元素 LNode *p = L; int j = 0; while((p->next) && (j < i - 1)){ p = p->next; ++j; } if(!(p->next)|| (j > i -1)) return ERROR; LNode *q = p->next; p->next = q->next; delete q; return OK; } // //显示 void display(LinkList L){ LNode *p = L->next; cout << "学号" << "t" << "姓名" << "t" << "成绩" << endl; while(p){ cout << p->data.no << "t" << p->data.name << "t" << p->data.grade < next; } }
main.cpp
#include#include "LinkList.h" using namespace std; // 系统菜单 void SystemMenu(){ cout << "nn链表的基本操作实验" << endl; cout << "t1. 初始化" << endl; cout << "t2. 根据学生人数建立链表(前插法)" << endl; cout << "t3. 根据学生人数建立链表(后插法)" << endl; cout << "t4. 插入元素" << endl; cout << "t5. 删除元素" << endl; cout << "t6. 显示元素" << endl; cout << "t7. 取元素" << endl; cout << "t8. 查找(根据姓名)" << endl; cout << "t9. 退出" << endl; cout << "t请选择一个操作:"; } int main() { int item; LinkList L; while(true){ SystemMenu(); cin >> item; switch(item){ case 1: { InitList(L); cout << "初始化成功!" << endl; break; } case 2: { int n; cout << "请输入链表个数n" < > n; CreateList_H(L,n); cout << "链表创建成功!" << endl; break; } case 3: { int n; cout << "请输入链表个数n" < > n; CreatrList_R(L,n); cout << "链表创建成功!" << endl; break; } case 4: { int index; int grade; char no[8], name[20]; Student stu; cout << "请输入学生学号,姓名,成绩!" << endl; cin >> no >> name >> grade; strcpy(stu.no, no); strcpy(stu.name, name); stu.grade = grade; cout << "请输入要插入的位置" << endl; cin >> index ; ListInsert(L,index,stu); cout << "插入元素成功!" << endl; break; } case 5: { int index; cout << "请输入要删除的位置" << endl; cin >> index; ListDelete(L,index); cout << "删除元素成功!" << endl; break; } case 6: { display(L); break; } case 7: { int index; cout << "请输入取值位置" << endl; cin >> index; LNode *p = GetElem(L,index); cout << "学号" << "t" << "姓名" << "t" << "成绩" << endl; cout << p->data.no << "t" << p->data.name << "t" << p->data.grade << endl; break; } case 8: { char name[20]; cout << "请输入要查找的姓名!" << endl; cin >> name; LNode *p = LocateElem(L,name); cout << "学号" << "t" << "姓名" << "t" << "成绩" << endl; cout << p->data.no << "t" << p->data.name << "t" << p->data.grade << endl; break; } case 9: { exit(0); } default: cout << "选择的操作无效!" << endl << endl; } } return 0; }



