线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现
顺序结构
//line.h
#ifndef _LINE_H
#define _LINE_H
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 1
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;
int listsize;
}Sqlist;
//函数声明
extern Status InitList_Sq(Sqlist &L);
extern Status Display_Sq(Sqlist &L);
extern Status ListInsert_Sq(Sqlist &L,int i,ElemType e);
extern Status ListDelete_sq(Sqlist &L,int i,ElemType &e);
extern Status LocateElem_sq(Sqlist L,ElemType e);
#endif
//function.cpp
#include
#include "line.h"
#include
#include
Status InitList_Sq(Sqlist &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status Display_Sq(Sqlist &L)
{
for(int i=0;iL.length+1)
return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
Status ListDelete_sq(Sqlist &L,int i,ElemType &e){
int*p;
int*q;
if(i<1||i>L.length)
return ERROR;
p=&(L.elem[i]);
e=*p;
q=L.elem+L.length;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
return OK;
}
Status LocateElem_sq(Sqlist L,ElemType e){
int i=1;
int *p;
p=L.elem;
while (i<=L.length&& (*p++!=e))
++i;
if (i<=L.length){
return i;}
else
return 0;
}
//main.cpp
#include
#include "line.h"
#include
#include
void main()
{
Sqlist L;
int i,j,n,k;
ElemType e;
char select;
if(InitList_Sq(L)==OVERFLOW)
printf("分配失败,退出程序!");
else{ printf("输入个数:\n");
scanf("%d",&n);
printf("请为初始化顺序表输入%d个整数:\n",n);
for(i=0;i
#include
#include "head.h"
using namespace std;
Status CreateList_L(LinkList &L, int n)
// 逆序输入 n 个数据元素,建立带头结点的单链表
{
int i;
LNode *p;
L=(LinkList) malloc (sizeof (LNode));
L->next = NULL;
for (i = n; i>0; --i)
{
p = (LinkList) malloc (sizeof (LNode));
cin>>p->data;// 输入元素值
p->next = L->next;
L->next = p; // 插入到表头
}
return OK;
}
Status GetElem_L(LinkList L,int i,ElemType &e)
// L是带头结点的链表的头指针,以 e 返回第 i 个元素
{
int j;
LNode *p;
p = L->next;
j = 1;
while (p && jnext; ++j; }
if ( !p || j>i )
return ERROR; // 第 i 个元素不存在
e = p->data; // 取得第 i 个元素
return OK;
}
Status ListInsert_L(LinkList &L, int i, ElemType e)
// L 为带头结点的单链表的头指针,在链表中第i 个结点之前插入新的元素e
{
LNode *s;
int j;
LNode *p;
p = L;
j = 0;
while (p && j < i-1)
{ p = p->next; ++j; } // 寻找第 i-1 个结点
if (!p || j > i-1)
return ERROR;
s = (LinkList) malloc ( sizeof (LNode)); // 生成新结点
s->data = e;
s->next = p->next;
p->next = s; // 插入L中
return OK;
}
Status ListDelete_L(LinkList L, int i, ElemType &e)
// 删除以 L 为头指针(带头结点)的单链表中第 i 个结点
{
int j;
LNode *p,*q;
p = L;
j = 0;
while (p->next && j < i-1)
{p = p->next; ++j; } // 寻找第 i 个结点,并令 p 指向其前趋
if (!(p->next) || j > i-1)
return ERROR; // 删除位置不合理
q = p->next;
p->next = q->next; // 删除并释放结点
e = q->data;
free(q);
return OK;
}
void display_L(LinkList &L,int n)//输出链表数据
{LNode *q;
q=L;
int i=1;
while(i<=n)
{
cout<next->data<<" ";
q=q->next;
i++;
}
}
//main.cpp
#include
#include "head.h"
using namespace std;
void main()
{
int i,n,e;
LinkList L;
char select;
cout<<"请输入线性表总个数n:"<>n;
cout<<"逆序输入线性表:"<>select;
cout<>i;
if(GetElem_L(L,i,e)==ERROR)
cout<<"输入的值不合法"<>i;
cout<<"要插入的数是多少?"<>e;
ListInsert_L(L,i,e);
cout<<"插入数成功!"<>i;
ListDelete_L(L,i,e);
display_L(L,--n);
cout<
本文档为【线性表的基本运算在两种存储结构】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。