线性表的基本操作
来源:互联网 发布:java实现线程安全 编辑:程序博客网 时间:2024/05/16 14:15
实验目的:了解线性表的基本概念,掌握线性表的两种存储结构——顺序存储和链式存储,掌握在两种存储结构上实现线性表的基本操作,掌握用C上机调试线性表操作的基本方法。
实验内容:
a.输入一组整型元素序列,建立线性表。
b.实现该线性表的遍历。
c.在该线性表中查找某一元素,查找成功显示查找元素,否则显示查找失败。
d.在该线性表中删除或插入指定元素。
实验要求:分别采用线性表的两种存储结构(顺序存储结构、链式存储结构)来实现以上基本操作。
顺序表
#include<stdio.h>#include<iostream>#include<stdlib.h>#include<iomanip>#define LIST_INIT_SIZE 5#define LISTINCREMENT 10using namespace std;typedef struct{ int *elem; int length; int listsize;}SqList;int InitList_Sq(SqList &L){ //构造一个空的线性表L L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); if(!L.elem) return 0; //存储分配失败 L.length=0; //空表长度为0 L.listsize=LIST_INIT_SIZE; //初始存储容量 return 0; }void return_elem(SqList L)//遍历顺序表 { cout<<"表中元素为:"<<endl; for(int i=0;i<L.length;i++) { cout<<setw(5)<<L.elem[i]; } cout<<endl;}void LocateElem_Sq(SqList L,int e,int (*compare)(int,int))//在顺序表中查找第一个与e满足compare()的元素的位序//若找到,则返回其在L中的位序,否则返回0 { int i=1; //i的初值为第一个元素的位序 int *p=L.elem; //p的初值为第一个元素的存储位置 while(i<=L.length&&!(*compare)(*p++,e))++i; //当i的值不超过表长且比较的两个数不相等时继续 if(i<=L.length){ cout<<e<<"是该表中的第"<<i<<"个元素"<<endl; } else{ cout<<"没有找到该元素"<<endl; }}int compare(int i,int j){ if(i==j) return 1; else return 0;}int ListInsert_Sq(SqList &L,int i,int e)//在顺序表L中第i个位置之前插入新的元素e//i的合法值为1 ≤i≤L.length+1 { if(i<1||i>L.length+1) { cout<<"插入位置不合法"<<endl; exit(1); //i值不合法 } if(L.length>=L.listsize) { //存储空间已满,增加分配 int *newbase; newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int)); if(!newbase)exit(1);//存储分配失败 L.elem=newbase; L.listsize+= LISTINCREMENT; } int *q; q=&(L.elem[i-1]);//q为插入位置 for(int *p=&(L.elem[L.length-1]); p>=q; --p) { *(p+1)=*p;//插入位置之后元素右移 } *q=e;//插入e ++L.length; return 0; }int ListDelete_Sq(SqList &L,int i)//删除元素 { if(i<1||i>L.length)exit(1); int *p=&L.elem[i-1];//p为要删除元素的位置 int *q=&L.elem[L.length-1];//标记最后一个元素的位置 for(;p<q;p++) { *p=*(p+1); } L.length--; return 0;}int main(){ int num; SqList L; InitList_Sq(L); int e1; int e2; int e3; int location; cout<<"请输入元素的个数"<<endl; cin>>num; if(num>100||num<1)return 0;//num值不合法 cout<<"请输入"<<num<<"个元素"<<endl; for(int i=0;i<num;i++) { cin>>L.elem[i]; ++L.length; } return_elem(L); //输出表中元素 cout<<"请输入要查找的元素"<<endl; cin>>e1; int (*pf) (int,int); //定义指向函数的指针 pf=compare; //将函数的入口地址赋给 pf LocateElem_Sq(L,e1,pf); // LocateElem_Sq(L,e,compare); cout<<"请输入要插入的元素"<<endl; cin>>e2; cout<<"请输入要插入的位置"<<endl; cin>>location; ListInsert_Sq(L,location,e2); return_elem(L); //输出表中元素 cout<<"请输入要删除的元素的位置"<<endl; cin>>e3; ListDelete_Sq(L,e3); //删除元素 return_elem(L); //输出表中元素 return 0;}
链表
#include<stdio.h> //c#include<stdlib.h> //malloc#include<iostream> //c++#include<iomanip>using namespace std;typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;void CreateList_L(LinkList &L,int n)//逆位序输入n个元素的值,建立带表头结点的单链线性表L //!!!!逆位序,逆位序,逆位序 !!! ! { if(n<1)exit(1);//num值不合法 LNode *p; L=(LinkList) malloc (sizeof (LNode)); L->next=NULL; //先建立一个带头结点的单链表 cout<<"请输入"<<n<<"个元素"<<endl; for (int i=n;i>0;--i) //头节点没有data { p=(LinkList) malloc (sizeof (LNode));//生成新节点 scanf("%d",&p->data); //输入元素值 p->next=L->next; //插入到表头 L->next=p; } }void return_elem(LinkList L)//遍历顺序表 { LNode *p; p=L->next; cout<<"表中元素为:"<<endl; while(p) { cout<<setw(5)<<p->data; p=p->next; } cout<<endl;}int search(LinkList L,int s){ LNode *p=L; p=p->next; //头指针为空,跳过头指针 int j=1; while(p&&j<s) { p=p->next; j++; } if (!p)cout<<"没有找到该元素"<<endl; else cout<<"链表中的第"<<s<<"个元素为:"<<p->data<<endl; return 0; }int ListInsert(LinkList &L,int i,int e){ LNode *q=L; int j=0; while(q&&j<i-1) { q=q->next; j++; } //当插入位置合理以后再开辟内存 if(!q||j>i-1)exit(1); LNode *p=(LinkList) malloc (sizeof (LNode)); p->data=e; p->next=q->next; q->next=p; return 0;}void ListDelate(LinkList &L,int i)//删除元素 { LNode *q=L; int j=0; while(q->next&&j<i-1) { q=q->next; j++; } if(!q->next||j>i-1)exit(1); LNode *p; p=q->next;//要删除的元素 q->next=p->next; free(p); }int main(){ int num; int s; LinkList L; int location; int e; cout<<"请输入元素的个数"<<endl; cin>>num; CreateList_L(L,num); return_elem(L); cout<<"请输入要查找元素的位序"<<endl; cin>>s; search(L,s); cout<<"请输入插入的元素以及元素的位置"<<endl; cin>>e>>location; ListInsert(L,location,e); return_elem(L); cout<<"请输入要删除元素的位置"<<endl; cin>>location; ListDelate(L,location);//删除元素 return_elem(L); return 0;}
阅读全文