本文共 4263 字,大约阅读时间需要 14 分钟。
#includeusing namespace std;//函数结果状态代码#define OK 1#define ERROR 0typedef int Status; // Status 相当于 int typedef char ElemType; //ElemType 相当于 chartypedef struct LNode{ //类型定义 ElemType data; struct LNode *next;}LNode,*LinkList;LinkList L; //创建单链表L LNode *p,*q,*s,*r; //或LinkList p,q;int j; Status InitList(LinkList &L); //始化操作,建立一个空的线性表LStatus DestroyList(LinkList &L); //销毁单链表LStatus ClearList(LinkList &L); //清空单链表L int ListEmpty(LinkList L); //判断是否为空 int ListLength(LinkList L); //求单链表L的表长Status GetElem(LinkList L,int i,ElemType &e); //取L中第i个的值 Status LocateElem(LinkList L, ElemType &e); //在线性表L中查找值为e的数据元素的位置序号 Status ListInsert(LinkList &L,int i,ElemType e);//在L中第i个元素之前插入数据元素eStatus ListDelete(LinkList &L,int i,ElemType &e);//将线性表L中第i个数据元素删除 void CreateList_H(LinkList &L,int n);//前插法 void CreateList_R(LinkList &L,int n);//后插法 int main(){ int ret=InitList(L); if(ret) cout << "建立单链表成功" << endl; else cout << "建立单链表失败" << endl; int i; cout << "请输入数据个数为:"; cin >> i; cout << "请输入" << i << "个数据元素:" << endl;// CreateList_H(L,i); //前插 注意两个方法输入的数据顺序相反 CreateList_R(L,i); //后插 cout << "单链表的长度为:" << ListLength(L) << endl; ElemType e; cout << "请输入要取出数据的序号为:"; cin >> i; GetElem(L,i,e); cout << "取出第"<< i << "个的数据为:" << e << endl; cout << "请输入查找的元素:"; cin >> e; LocateElem(L, e); cout << "元素" << e << "的序号为:" << j << endl; cout << "请输入要插入的元素和位置:"; cin >> e >> i; ret= ListInsert(L,i,e); if(ret) cout << "插入成功" << endl; else cout << "插入失败" << endl; cout << "插入后的单链表长度为:" << ListLength(L) << endl; cout << "请输入要删除的元素的序号:"; cin >> i ; ret= ListDelete(L,i,e); if(ret) cout << "删除成功" << endl; else cout << "删除失败" << endl; cout << "清空线性表" << endl; ClearList(L); ListEmpty(L); if(ListEmpty(L)) cout << "线性表为空" << endl; else cout << "线性表非空" << endl; DestroyList(L); cout << "线性表已销毁" << endl; return 0;} Status InitList(LinkList &L){ //构造一个空的单链表L L=new LNode; //生成新结点作为头结点,用头指针L指向头结点 L->next=NULL; //头结点的指针域为空 return OK;} Status DestroyList(LinkList &L){ //销毁单链表L while(L){ p = L; L=L->next; delete p; }}Status ClearList(LinkList &L){ //清空单链表L p=L->next; while(p){ //没到表尾 q=p->next; delete p; p=q; } L->next=NULL; //头结点指针域为空 return OK;} int ListEmpty(LinkList L){ //若L为空表,则返回1,否则返回0 if(L->next) //非空 return 0; else return 1; } int ListLength(LinkList L){ //返回L中数据元素个数 p=L->next; //p指向第一个结点 int i=0; while(p){ //遍历单链表,统计结点数 i++; p=p->next; } return i;} Status GetElem(LinkList L,int i,ElemType &e){ //获取线性表L中的某个数据元素的内容,通过变量e返回 p=L->next;j=1; //初始化 while(p&&j next; ++j; } if(!p||j>i) return ERROR; //第i个元素不存在 else{ e = p->data; //取第i个元素 return OK; } }//在线性表L中查找值为e的数据元素的位置序号 Status LocateElem(LinkList L, ElemType &e){ //返回L中值为e的数据元素的位置序号,查找失败返回0 p=L->next; j=1; while(p && p->data!=e){ p=p->next; j++; } if(p) return j; else return 0; } //在L中第i个元素之前插入数据元素eStatus ListInsert(LinkList &L,int i,ElemType e){ p=L;j=0; while(p && j < i-1){ //寻找第i-1个结点,p指向i-1结点 p=p->next; ++j; } if(!p||j>i-1) //i大于表长+1或者小于1,插入位置非法 return ERROR; s = new LNode; //生成新结点s,将结点s的数据域置为e s->data = e; s->next = p->next; //将结点s插入L中 p->next = s; return OK;} //将线性表L中第i个数据元素删除 Status ListDelete(LinkList &L,int i,ElemType &e){ p=L;j=0; while(p->next && j < i-1){ //寻找第i个结点,并令p指向其前驱 p=p->next; ++j; } if(!(p->next)||j>i-1) //删除位置不合理 return ERROR; q=p->next; //临时保存被删结点的地址以备释放 p->next=q->next; //改变删除结点前驱节点的指针域 e=q->data; // 保存删除结点的数据域 delete q; // 释放删除结点的空间 return OK; } void CreateList_H(LinkList &L,int n){ L = new LNode; L->next=NULL; //先建立一个带头结点的单链表 for(int i=n;i>0;--i){ p=new LNode; //生成新结点 p=(LNode*)malloc(sizeof(LNode)); cin >> p->data; // 输入元素值scanf(&p->data); p->next = L->next; //插入到表头 L->next = p; }} //CreateList_H 正位序输入n个元素的值,建立带头表结点的单链表Lvoid CreateList_R(LinkList &L,int n){ L=new LNode; L->next=NULL; r = L; //尾指针r指向头结点 for(int i=0;i > p->data; //生成新结点,输入元素值 p->next=NULL; r->next=p; //插入到表尾 r=p; //指针r指向新的尾结点 }}
转载地址:http://yvoy.baihongyu.com/