萌新笔记01 线性表

顺序表的定义:

数据结构三要素:逻辑结构、数据的运算、存储结构

线性表的顺序存储又称顺序表。
线性表中元素的位序是从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;

你可能感兴趣的:(萌新笔记01 线性表)