数据结构 实验三 单链表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "LinkList.h" const int N=3; void main() { LinkList L; ElemType a[N]; cout<<"请放入"<<N<<"个学生的编号、姓名、性别和成绩建立单链 表:\n"; for(int i=0;i<N;i++) cin>>a[i].num>>a[i].name>>a[i].sex>>a[i].score; CreateList_L(L,a,N); cout<<"建立的单链表为:"<<endl; ListTraverse_L(L); LNode *s=new LNode; cout<<"请输入要插入的学生的编号、姓名、性别和成绩:\n"; cin>>s->data.num>>s->data.name>>s->data.sex>>s->data.score; ListInsert_L(L,L->next,s); cout<<"在第一个结点前插入结点后:"<<endl; ListTraverse_L(L); ElemType e; cout<<"请输入要删除学生的编号:\n"; cin>>e.num; if (LocateElem_L(L,e)) { ListDelete_L(L,LocateElem_L(L,e),e); cout<<"删除的元素为:"<<e.num<<" "<<e.name<<" "<<e.sex<<" " <<e.score<<endl; } else cout<<"链表中不存在该元素."<<endl; ListTraverse_L(L); InvertLinkedList(L); cout<<"逆置单链表后:"<<endl; ListTraverse_L(L); cout<<"单链表长度为: "<<ListLength_L(L)<<endl;
LinkList p=L->next; while(p!=NULL) { L->next=p->next; delete p; p=L->next; } } // 4. 判断链表是否为空 bool ListEmpty_L( LinkList L) { if (!L->next) return true; return false; } // 5. 求链表的长度 int ListLength_L( LinkList L) { LinkList p=L->next; int k=0; while ( p ) { k++; p=p->next; } return k; } // 6. 查找链表中的第i个元素 void ErrorMessage(char* s) { cout<<s<<endl; exit(0); }
float score; //成绩 }ElemType; // 结点的结构定义 struct LNode { ElemType data; struct LNode *next; }; typedef struct LNode LNode; // LNode为结点类型 typedef struct LNode *LinkList; //LinkList为指针类型 //基本操作的实现 // 1. 初始化操作 void InitList_L(LinkList &L) //带头结点的单链表 { L= new LNode ; //生成一个头结点 L->next=NULL; //设置一个空表让头结点的指针域为空 } // 2. 销毁线性表 void DestroyList_L(LinkList &L) { LinkList p=L->next; while(p!=NULL) { L->next=p->next; delete p; p=L->next; } delete L; } // 3. 清空线性表 void ClearList_L(LinkList &L) {
}
实验三 单链表的C++实现
一、实验目的:掌握单链表的定义及操作的C++语言实现方法。 二、实验内容: 已知数据元素的类型定义如下: typedef struct { long num;// 编号 char name[20]; //姓名 char sex; //性别 float score; //成绩 }ElemType; 1.设计头文件LinkList.h,包含数据类型定义和顺序表的基本操作; 2.设计程序文件LinkList.cpp,利用单链表完成一个班级学生信息的管 理,实现:学生信息的输入、删除、插入、查询、输出、逆置等功能。 注:学生基本信息存入二进制文件Student.dat 学生表格式如下: 编号 姓名 性别 成绩 1001 LI M 78 1002 ZHANG F 87 1003 WANG F 67 …… 附程序清单: LinkList.h #include <iostream> #include <iomanip> #include <fstream> #include <process.h> using namespace std; // 数据元素结构定义 typedef struct { long num; //编号 char name[20]; //姓名 char sex; //性别
LinkList p=L->next; while ( p ) { visit(p->data); p=p->next; }; } // 9. 在链表中将 s 结点插入到 p 结点之前 void ListInsert_L( LinkList &L, LNode *p, LNode* s ) //带头结点 { LNode *q = L; while (q->next!=p ) q = q->next; // 查找 p 的前驱 q q->next = s; s->next = p; // 在q结点之后插入s结点 } //将对首元结点的操作和其他结点的操作统一起来 // 10. 从链表中删除p结点并由e返回其元素 void ListDelete_L( LinkList &L, LNode* p, ElemType &e ) //带头结点 { LNode *q = L; while (q->next !=p) q = q->next; // 查找 p 的前驱结点 q q->next = p->next ; // 修改 q 结点的指针域 e = p->data; // 返回被删结点的数据元素 delete p; // 并释放结点空间 } // 11. 逆置创建单链表 // 已知一维数组A[n]中存有线性表的数据元素,逆序创建单链线性表L void CreateList_H(LinkList &L, ElemΒιβλιοθήκη Baiduype A[], int n ) //带头结点 { LinkList s; L = new LNode; L->next=NULL; // 先建立一个空的单链表 for ( int i=n-1; i>=0; --i ) { s = new LNode; // 生成新结点
void GetElem_L(LinkList L,int i, ElemType &e) { LinkList p=L->next; int k=1; while (p&&k<i) { k++; p=p->next; } if(p!=NULL) e=p->data; else ErrorMessage("i值不合法!"); } // 7. 在链表中查找第一个值和e相等的数据元素,若存在,则返回它在 链表中的位置, // 即指向该数据元素所在结点的指针;否则返回 NULL LNode* LocateElem_L( LinkList L, ElemType e) { LNode *p=L->next; while ( p && p->data.num!=e.num ) { p=p->next; } return p; } // 8. 依次输出链表中每一个结点中的数据元素的内容(遍历) void visit(ElemType e) //输出单个数据元素的内容 { cout<<setiosflags(ios_base::left)<<setw(8)<<e.num<<setw(10)<<e.name <<resetiosflags(ios_base::left)<<setw(4)<<e.sex<<setw(8) <<e.score<<endl;; } void ListTraverse_L( LinkList L) { cout<<" ======== 学生基本信息表 ========"<<endl<<endl; cout<<" 编号 姓名 性别 成绩"<<endl;
s->data = A[i]; // 赋元素值 s->next = L->next; L->next= s; } // 插入在第一个结点之前 } // 12. 建立单链表(正序) // 已知一维数组A[n]中存有线性表的数据元素,创建顺序单链线性表L void CreateList_L(LinkList &L, ElemType A[], int n ) //带头结点 { LNode *p,*s; L = new LNode; L->next=NULL; p=L; // 先建立一个空的单链表 for ( int i=0; i <= n-1; ++i ) { s=new LNode; // 生成新结点 s->next= NULL; s->data = A[i]; // 赋元素值 p->next =s; p=s; } } // 13. 逆置单链表 void InvertLinkedList( LinkList &L ) //带头结点 { LNode *p,*s; p = L->next; L->next = NULL; while ( p ) { s = p; p = p->next; // 从 p 所指链表中删除第一个结点(s 结点) s->next = L->next; L->next = s; } // 将 s 结点插入到逆置表的表头 } LinkList.cpp
相关文档
最新文档