线性表之顺序表
一、线性表的定义
从逻辑结构的角度来讲,线性表中各个元素之间是唯一的、并且有序排列的关系。
从存储结构的角度来看,线性表的具体实现过程中可采用顺序存储结构和链式存储结构。
顺序存储结构的线性表称为顺序表,链式存储结构的线性表分为单链表和双链表。
二、顺序表
#include "stdafx.h"
#include "head.h"
using namespace std;
#define MAXSIZE 100
//功能:顺序表的线性存储结构中存的内容
typedef struct
{
char Info[20];
}dataType;
//功能:顺序表的线性存储结构
typedef struct _SeqList
{
dataType data[MAXSIZE];
int len;//线性表长度
}SeqList, *pSeqList;
//功能:头文件包含
void InitList(pSeqListL);
bool InsertList(pSeqList L, int i, dataType x);
void display(pSeqList L);
bool Delete(pSeqList L, int i);
dataType GetNode(pSeqList L, int i);
int FindNode(pSeqList L, dataType* pNode);
int _tmain(int argc, _TCHAR* argv[])
{
int i, len;
dataType node;
SeqList List;
len = sizeof(List);
InitList(&List);
for (i = 1; i < 6; i++)
{
ZeroMemory(&node, sizeof(dataType));
strcpy(node.Info, "hello");
InsertList(&List, i, node);
}
ZeroMemory(&node, sizeof(dataType));
strcpy(node.Info, "hello2");
InsertList(&List, 6, node);
for (i = 7; i < 9; i++)
{
ZeroMemory(&node, sizeof(dataType));
strcpy(node.Info, "hello1");
InsertList(&List, i, node);
}
display(&List);
ZeroMemory(&node, sizeof(dataType));
strcpy(node.Info, "hello2");
i = FindNode(&List, &node);
return 0;
}
//功能:顺序表的初始化
void InitList(pSeqListL)
{
memset(L, 0, sizeof(SeqList));
}
//功能:顺序表的插入运算
//在表的第i个元素与第i+1个元素之间插入x, 第i+1个之后的元素全部后移一位
//a0 a1 a2 a3 ... a(i-1) ai a(i+1) ... a(n-1)
//1 2 3 4 i i+1 n (len = n)
bool InsertList(pSeqList L, int i, dataType x)
{
int j;
if (L->len > (MAXSIZE - 1))
{
printf("列表已经溢出\n");
return false;
}
else if (i < 1 || i > (L->len + 1))
{
printf("插入位置不合法");
return false;
}
else
{
for (j = L->len - 1; j > i - 2; j--)
{
L->data[j+1] = L->data[j];
}
L->data[i-1] = x;
L->len++;
return true;
}
}
//功能:顺序表的显示
void display(pSeqList L)
{
int i;
if (L->len == 0)
{
cout<<"顺序表无数据\n";
return;
}
for (i = 0; i < L->len; i++)
{
cout<<L->data[i].Info<<endl;
}
}
//功能:顺序表的删除运算
//删除表的第i个元素, 第i+1个之后的元素全部前移一位
//a0 a1 a2 a3 ... a(i-1) ai a(i+1) ... a(n-1)
//1 2 3 4 i i+1 n (len = n)
bool Delete(pSeqList L, int i)
{
int j;
if (L->len == 0)
{
printf("empty List");
return false;
}
else if (i < 1 || i > L->len )
{
printf("删除越界");
return false;
}
else
{
for (j = i ; j < L->len; j++)
{
L->data[j-1] = L->data[j];
}
L->len--;
return true;
}
}
//功能:按序号取节点
dataType GetNode(pSeqList L, int i)
{
dataType* pdata = new dataType;
ZeroMemory(pdata, sizeof(dataType));
if (i < 1 || i > L->len)
{
printf("越界");
return *pdata;
}
return *pdata = L->data[i-1];
}
//功能:节点查询
int FindNode(pSeqList L, dataType* pNode)
{
int i;
for (i = 0; i < L->len; i++)
{
if (strcmp(L->data[i].Info, pNode->Info) == 0)
{
return i+1;
}
}
return 0;
}