1、顺序表的基本操作
using namespace std;
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define True 1
#define False 0
#define Ok 1
#define Error 0
#define Infeasible -1
#define Overflow -2
typedef int Status;
typedef int ElemType;
#define ListInitSize 100 //线性表存储空间的初始分配量
#define ListIncrement 10//线性表存储空间的分配增量
//动态申请存储空间的顺序表
typedef struct{//顺序表定义
ElemType *elem; //指示动态分配数组的指针
int listsize; //当前分配的存储容量
int length;//长度
}DynList;
Status DynInitList(DynList &L)//顺序表的初始化
{
L.elem = (ElemType*)malloc(ListInitSize*sizeof(ElemType));
if(!L.elem)
exit(Overflow);
L.length = 0;
L.listsize = ListInitSize;
cout<<"初始化"<<endl;
return Ok;
}
//在线性表L中第i个位置之前插入新的元素e
Status ListInsert_Sq(DynList &L,int i, ElemType e){
//第一步:判断数据是否合法
if(i<1 || i> L.length +1)
return Error;
//第二步:判断当前存储空间已满,增加分配
if(L.length >= L.listsize)
{
ElemType *newbase;
newbase = (ElemType *)realloc(L.elem,
(L.listsize + ListIncrement)*sizeof(ElemType));
if(!newbase)
exit(Overflow);//终结程序
L.elem = newbase; //新基址
L.listsize += ListIncrement;//增加存储容量
}
//插入元素:
//1、先找到插入的位置
//2、将所有的元素向后移动一个单元
//3、插入元素,表长增1
int *q,*p;
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 ListOutput_Sq(DynList L)
{
int len = L.length;
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<"\t";
}
}
//顺序表的查找(按值查找)
Status ListLocate_Sq(DynList L,ElemType e)
{
int loc=0;
for(int i=0;i<L.length;i++){
if(L.elem[i] == e)
loc = i+1;
}
if(loc==0){
cout<<"没有这个值"<<endl;
}
else
cout<<e<<"是第"<<loc<<"个值"<<endl;
return loc;
}
//顺序表的删除
Status ListDelete_Sq(DynList &L,int e)
{
int loc=0;
loc = ListLocate_Sq(L,e);
for(int i=loc-1;i<L.length+1;i++){
L.elem[i] = L.elem[i+1];
}
L.length--;
return Ok;
}
typedef struct Node{//单链表的定义
ElemType data;
struct Node *next;
}Node,*LinkedList;
LinkedList LinkedInit()//单链表的初始化
{
Node *L;
L = (Node*)malloc(sizeof(Node));
if(L==NULL)
{
cout<<"内存分配失败"<<endl;
}
else{
cout<<"内存分配成功"<<endl;
}
L->next =NULL;
return L;
}
int main()
{
DynList DynL;
DynInitList(DynL);
ListInsert_Sq(DynL,1,1);
ListInsert_Sq(DynL,1,61);
ListInsert_Sq(DynL,1,84);
ListInsert_Sq(DynL,1,52);
ListInsert_Sq(DynL,1,11);
ListInsert_Sq(DynL,4,48);
ListOutput_Sq(DynL);
ListLocate_Sq(DynL,61);
ListDelete_Sq(DynL,61);
ListOutput_Sq(DynL);
//LinkedInit();
return 0;
}
结果显示:
补充:
2、链表
typedef struct Node{//单链表的定义
ElemType data;
struct Node *next;
}Node,*LinkedList;
LinkedList LinkedInit()//单链表的初始化
{
Node *L;
L = (Node*)malloc(sizeof(Node));
if(L==NULL)
{
cout<<"内存分配失败"<<endl;
}
else{
cout<<"内存分配成功"<<endl;
}
L->next =NULL;
return L;
}
int LinkLength(LinkedList L)//求链表的长度
{
int len = 0;
while(L->next)
{
len++;
}
return len;
}
Status LinkInsert(LinkedList &L,int i,ElemType e)//单链表的插入
{
/*
int length = LinkedLength(L);
if(i>length)
exit(Overflow);
*/
Node *pre,*pi;
pre = L;
int num = 0;
while(pre && num < i-1)
{
pre = pre->next;
num++;
}
pi = (Node*)malloc(sizeof(Node));
pi->data = e;
pi->next = pre->next;
pre->next = pi;
return Ok;
}
Status LinkedLocate(LinkedList L,ElemType e)//按值查找
{
Node *p;
p = L->next;
int num=1;
while(p&&p->data!=e)
{
num++;
p = p->next;
}
cout<<e<<"是第"<<num<<"个元素"<<endl;
return num;
}
Status LinkedDelete(LinkedList L,ElemType e)//链表的删除
{
int num = LinkedLocate(L,e);
Node *pre,*pi;
pre = L;
int j=0;
while(pre->next&&j<num-1)
{
pre = pre->next;
j++;
}
pi = pre->next;
pre->next = pi->next;
free(pi);
return Ok;
}
Status LinkedOutput(LinkedList L)//链表的输出
{
Node *p;
p = L->next;
while(p)
{
cout<<p->data<<"\t";
p = p->next;
}
return Ok;
}
int main()
{
LinkedList LinkL;
LinkL = LinkedInit();
int length = LinkLength(LinkL);
cout<<"这个链表的长度为:"<<length<<endl;
LinkInsert(LinkL,0,65);//&是传输,函数里加,调用的时候不加
LinkInsert(LinkL,0,6);
LinkInsert(LinkL,0,5);
LinkInsert(LinkL,0,56);
LinkedOutput(LinkL);
LinkedDelete(LinkL,6);
LinkedOutput(LinkL);
return 0;
}
结果显示: