线性表的建立及基本操作的实现

(1)建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
(2)利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素66。
(3)建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。
急求!

// 8888888.cpp : Defines the entry point for the console application.
//

// practice31.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream.h>
// 线性表的动态分配顺序存储结构
#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
#define LISTINCREMENT 2 // 线性表存储空间的分配增量
typedef int ElemType;
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
// #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等
typedef int Boolean; // Boolean是布尔类型,其值是TRUE或FALSE

struct SqList
{
ElemType *elem; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
int InitList(SqList &L) // 算法2.3
{ // 操作结果:构造一个空的顺序线性表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(1); // 存储分配失败
L.length=0; // 空表长度为0
L.listsize=LIST_INIT_SIZE; // 初始存储容量
return 1;
}

int DestroyList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:销毁顺序线性表L
free(L.elem);
L.elem=NULL;
L.length=0;
L.listsize=0;
return 1;
}

int ClearList(SqList &L)
{ // 初始条件:顺序线性表L已存在。操作结果:将L重置为空表
L.length=0;
return 1;
}

int ListEmpty(SqList L)
{ // 初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
if(L.length==0)
return 0;
else
return 1;
}

int ListLength(SqList L)
{ // 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数
return L.length;
}

int GetElem(SqList L,int i,ElemType &e)
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:用e返回L中第i个数据元素的值
if(i<1||i>L.length)
exit(1);
e=*(L.elem+i-1);
return 1;
}
int equal(ElemType c1,ElemType c2)
{ // 判断是否相等的函数,Union()用到
if(c1==c2)
return 1;
else
return 0;
}
int LocateElem(SqList L,ElemType e)
{ // 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。算法2.6
ElemType *p;
int i=1; // i的初值为第1个元素的位序
p=L.elem; // p的初值为第1个元素的存储位置

while(i<=L.length&&!equal(*p++,e))
{
++i;
}
if(i<=L.length)
return i;
else
return 0;
}

int PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
// 否则操作失败,pre_e无定义
int i=2;
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length)
return 0;
else
{
pre_e=*--p;
return 1;
}
}

int NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{ // 初始条件:顺序线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
// 否则操作失败,next_e无定义
int i=1;
ElemType *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
i++;
p++;
}
if(i==L.length)
return 0;
else
{
next_e=*++p;
return 1;
}
}

int ListInsert(SqList &L,int i,ElemType e) // 算法2.4
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)+1
// 操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1) // i值不合法
return 0;
if(L.length>=L.listsize) // 当前存储空间已满,增加分配
{
if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
exit(1); // 存储分配失败
L.elem=newbase; // 新基址
L.listsize+=LISTINCREMENT; // 增加存储容量
}
q=L.elem+i-1; // q为插入位置
for(p=L.elem+L.length-1;p>=q;--p) // 插入位置及之后的元素右移
*(p+1)=*p;
*q=e; // 插入e
++L.length; // 表长增1
return 1;
}

int ListDelete(SqList &L,int i,ElemType &e) // 算法2.5
{ // 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
ElemType *p,*q;
if(i<1||i>L.length) // i值不合法
return 0;
p=L.elem+i-1; // p为被删除元素的位置
e=*p; // 被删除元素的值赋给e
q=L.elem+L.length-1; // 表尾元素的位置
for(++p;p<=q;++p) // 被删除元素之后的元素左移
*(p-1)=*p;
L.length--; // 表长减1
return 1;
}

int ListTraverse(SqList L,void(*vi)(ElemType&))
{ // 初始条件:顺序线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
// vi()的形参加'&',表明可通过调用vi()改变元素的值
ElemType *p;
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(*p++);
cout<<endl;
return 1;
}

void print(ElemType &c)
{
printf("%d ",c);
}

//
// 线性表的单链表存储结构
struct LNode
{
ElemType data;
LNode *next;
};
typedef LNode *LinkList; // 另一种定义LinkList的方法

// 操作结果:构造一个空的线性表L
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点
if(!L) // 存储分配失败
exit(1);
L->next=NULL; // 指针域为空
return OK;
}

// 初始条件:线性表L已存在。操作结果:销毁线性表L
Status DestroyList(LinkList &L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
return OK;
}

// 初始条件:线性表L已存在。操作结果:将L重置为空表
Status ClearList(LinkList L) // 不改变L
{
LinkList p,q;
p=L->next; // p指向第一个结点
while(p) // 没到表尾
{
q=p->next;
free(p);
p=q;
}
L->next=NULL; // 头结点指针域为空
return OK;
}

// 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE
Status ListEmpty(LinkList L)
{
if(L->next)
return FALSE;
else
return TRUE;
}

// 初始条件:线性表L已存在。操作结果:返回L中数据元素个数
int ListLength(LinkList L)
{
int i=0;
LinkList p=L->next; // p指向第一个结点
while(p) // 没到表尾
{
i++;
p=p->next;
}
return i;
}

// L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
Status GetElem(LinkList L,int i,ElemType &e)
{
int j=1; // j为计数器
LinkList p=L->next; // p指向第一个结点
while(p&&j<i) // 顺指针向后查找,直到p指向第i个元素或p为空
{
p=p->next;
j++;
}
if(!p||j>i) // 第i个元素不存在
return ERROR;
e=p->data; // 取第i个元素
return OK;
}

Status compare(ElemType a,ElemType b)
{
if(a==b)
return 1;
else
return 0;
}
// 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0
int LocateElem(LinkList L,ElemType e)
{
LinkList p;
int j=0;
p = L->next;
while(p)
{
j++;
if(compare(p->data,e))
p = p->next;
return j;
}
return 0;
}

// 初始条件: 线性表L已存在
// 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱,
// 返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE
Status PriorElem(LinkList L,ElemType cur_e,ElemType &pre_e)
{
LinkList p,q;
p = L->next;
while(p->next)
{
q = p->next;
if(q->data == cur_e)
{
pre_e = p->data;
return OK;
}
p = q;
}
return INFEASIBLE;
}

// 初始条件:线性表L已存在
// 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
//返回OK;否则操作失败,next_e无定义,返回INFEASIBLE
Status NextElem(LinkList L,ElemType cur_e,ElemType &next_e)
{
LinkList p,q;
p = L->next;
while(p->next)
{
if(p->data == cur_e)
{
next_e = p->next->data;
return OK;
}
p = p->next;

}
return INFEASIBLE;
}

// 在带头结点的单链线性表L中第i个位置之前插入元素e
Status ListInsert(LinkList L,int i,ElemType e)
{
int j=0;
LinkList p=L,s;
while(p&&j<i-1) // 寻找第i-1个结点
{
p=p->next;
j++;
}
if(!p||j>i-1) // i小于1或者大于表长
return ERROR;
s=(LinkList)malloc(sizeof(LNode)); // 生成新结点
s->data=e; // 插入L中
s->next=p->next;
p->next=s;
return OK;
}

// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
Status ListDelete(LinkList L,int i,ElemType &e)
{
LinkList p,q;
p = L;
int j=0;
while(p && j<i-1)
{
p = p->next;
j++;
}
if(!p || j>i-1)
return ERROR;
q = p->next;
e = q->data;
p->next = q->next;
free(q);
return OK;
}

// 初始条件:线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
Status ListTraverse(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return OK;
}

// 逆位序(插在表头)输入n个元素的值,建立带表头结构的单链线性表L
void CreateList(LinkList &L,int n)
{
L = (LinkList)malloc(sizeof(LNode));
LinkList p;
L->next = NULL;
scanf("%d",&n);
for(int i=n;i>0 ;--i)
{
p=(LinkList)malloc(sizeof(LNode)); // 生成新结点
scanf("%d",&p->data); // 输入元素值
p->next = L->next;
L->next = p;
}
}

// 正位序(插在表尾)输入n个元素的值,建立带表头结构的单链线性表
void CreateList2(LinkList &L,int n)
{
int i;
LinkList p,q;
L=(LinkList)malloc(sizeof(LNode)); // 生成头结点
L->next=NULL;
q=L;
printf("请输入%d个数据\n",n);
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
q->next=p;
q=q->next;
}
p->next=NULL;
}

int main(int argc, char* argv[])
{
SqList La,Lb;
int i;
int j;
i=InitList(La);
if(i==1) // 创建空表La成功
for(j=1;j<=5;j++) // 在表La中插入5个元素
i=ListInsert(La,j,j);
printf("La= "); // 输出表La的内容
ListTraverse(La,print);
printf("表长为:");
printf("%d\n",ListLength(La));

int a[7]= {21,23,14,5,56,17,31};
i=InitList(Lb);
if(i==1) // 创建空表La成功
for(j=1;j<=7;j++)
i=ListInsert(Lb,j,a[j-1]);
printf("Lb= "); // 输出表La的内容
ListTraverse(Lb,print);
int pos;
printf("在第几个位置插值:");
scanf("%d",&pos);
ListInsert(Lb,pos,66);
printf("Lb= "); // 输出表La的内容
ListTraverse(Lb,print);

//
int n=5;
LinkList Lc;
CreateList2(Lc,n); //按尾插入法来建立相应单链表
printf("按尾插入法来建立相应单链表\n");
printf("Lc="); // 输出链表La的内容
ListTraverse(Lc);

}
温馨提示:答案为网友推荐,仅供参考
相似回答