数据结构三要素:逻辑结构、数据的运算、存储结构
线性表的顺序存储又称顺序表。
线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
InitList(&L) 初始化表,构造一个空的线性表L,分配内存空间。
DestroyList(&L) 销毁操作,释放线性表L所占用的内存空间。
ListInsert(&L,i,e) 插入操作,在L中的第i个位置上插入指定元素e。
ListDelete(&L,i,&e) 删除操作,删除L中第i个位置的元素,并用e返回删除元素的值。
LocateElem(L,e) 按值查找操作,在L中查找具有给定关键字值的元素。
GetElem(L,i) 按位查找操作,获取L中第i个位置的元素的值。
线性表的顺序存储静态分配
typedef int ElemType;//假设ElemType是int类型
#define MaxSize 50
typedef struct
{
ElemType data[MaxSize];
int len;
}Sqlist;
动态分配
typedef int ElemType;
#define InitSize 100
typedef struct
{
ElemType *data;
int MaxSize;
int length;
}SeqList;
//初始动态分配语句为:
L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize);
顺序表基本操作的实现
插入操作
bool ListInsert(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)//如果给出的位置不对,返回false
{
return false;
}
if(L.length>=MaxSize)//如果已经不能再添加了,满了,返回false
{
return false;
}
for(int j=L.length;j>=i;j--)//要从后往前遍历移动,不然会丢失数据
{
L.data[j]=L.data[j-1];
}
L.data[i-1]=e;//在下标为i-1的地方填上e的值
L.length++;//线性表长度+1
return true;
}
删除操作
bool ListDelete(Sqlist &L,int i,ElemType &e)//第i个位置的元素,下标为i-1
{
if(i<1||i>L.length+1)//如果给出的位置不对,返回false
{
return false;
}
e=L.data[i-1];//把被删除的元素赋值给e传出
for(int j=i;j<L.length;j++)//将后边的元素依次前移
{
L.data[j-1]=L.data[j];
}
L.length--;//线性表长度-1
return true;
}
按值查找
int LocateElem(SqList &L,ElemType e)
{
int i;
for(i=0;i<L.length;i++)
{
if(L.data[i]==e)
{
return i+1;
}
}
return 0;
}
单链表上基本操作的实现
单链表结点类型的描述
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
头插法建立单链表
LinkList List_HeadInsert(LinkList &L)//强调是个单链表
{
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));//创建头结点
L->next = NULL;//头结点指向NULL
scanf("%d", &x);
while (x != 9999)//假设输入9999是截止
{
s = (LNode *)malloc(sizeof(LNode));//LNode*强调这是个结点
s->data = x;
s->next = L->next;//新结点插入表中
L->next = s;//头插,L指向s
scanf("%d", &x);
}
return L;
}
尾插法建立单链表
LinkList List_TailInsert(LinkList &L)
{
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
*r = L;//r为表尾结点
scanf("%d", &x);
while (x != 9999)
{
s = (LNode*)malloc(sizeof(LNode));//新申请一个结点
s->data = x;
r->next = s;//s接到表尾
r = s;//r指向新的表尾结点
scanf("%d", &x);
}
r->next = NULL;//尾结点指针置空
return L;
}
按序号查找结点值
LNode* GetElem(LinkList L, int i)
{//取出单链表L(带头结点)中第i个位置的结点指针
int j = 1;//计数,初始为1
LNode *p = L->next;//头结点指针赋给p
if (i == 0)
{
return L;//若i等于0,则返回头结点
}
if (i < 1)
{
return NULL;//若i无效,则返回NULL
}
while (p!=NULL&&j < i)//遍历查找
{
p = p->next;//向后移
j++;
}
return p;//找到
}
按值查找表结点值
LNode* LocateElem(LinkList L, ElemType e)
{//查找单链表L(带头结点)中数据等于e的结点指针,否则返回NULL
LNode *p = L->next;
while (p != NULL && p->data != e)
{
p = p->next;
}
return p;//返回该结点指针
}
双链表结点类型的描述
typedef struct DNode
{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinklist;