ps:从今天开始尽量每两三天写一篇日志,总结自己在复习中遇到的问题。
这两天主要复习了线性表的顺序存储结构和线性表的链表存储结构。
所谓顺序存储,是用数组来实现的,在内存中分配一块连续的地址区间,将数据按顺序存储到该数组中;
a1 | a2 | a3 | a4 | a5 | ...... | ai-1 | ai | ...... | an |
存储结构如下:
#define MAXSIZE 20
typedef int ElemType ;
typedef struct
{
ElemType data[MAXSIZE] ;
int length ;
}SqLst ;
主要运用包括
Status GetElement(SqList *L , int i , ElemType e) //取出第i个元素
{
if(L.length==0 || i < 1 || i > L.length)
return ERROR ;
e = L.data[i-1] ;
return OK;
}
Status InsertList(SqList * L , int i , ElemType e) //在第i个位置插入新元素
{
if(L.length == MAXSIZE) return ERROR ;
if(i < 1 || i > L.length+1) return ERROR ;
if(int j = L.length-1 ; j>=i-1 ; --j)
{
L.data[j+1] = L.data[j] ;
}
L.data[i] = e ;
L.length++ ;
return OK ;
}
Status ListDelete(SqList * L , int i , ElemType e) //删除第i个元素
{
if(L.length == 0 ) return ERROR ;
if(i < 1 || i>L.length) return ERROR ;
*e = L.data[i-1] ;
if(i < L.length) //不是删除表尾元素
{
for(int k = i ; k < L.length ; ++k)
{
L.data[k-1] = L.data[k] ;
}
}
L.length-- ;
return OK ;
}
线性表的链式存储结构每个数据元素包含两部分信息,一部分是数据信息,叫做数据域;一部分是指针域,存放后继元素的地址信息。
每个链表有一个头指针,指向链表的第一个元素;链表的最后一个元素的指针域为NULL。有的链表包含头结点、有的链表不包含头结点。头结点并不是真正意义上的第一个结点,因为它的数据信息是没有意义的。
单链表结构描述:
typedef struct Node
{
ElemType data ;
struct Node *node ;
}Node ;
typedef struct Node *LinkList ;
LinkList L :这里的L其实就相当于链表的头指针,指向这个链表。如果是没有头结点的链表,那么L就是指向的第一个结点,L->data为第一个结点的数据域;L->next为第二个节点。但是如果链表是有头结点的,L->next才是第一个结点。
LinkList *L :这里的L是指向链表的头指针的指针,*L才是链表的头指针,因此如果没有头结点的链表,那么(*L)就是指向第一个结点,(*L)->data就是第一个结点的数据域;如果是带有头结点的链表,(*L)->next为第一个结点。
主要操作:(均以不带头结点的链表为例)
Status GetElem(LinkList L , int i , ElemType *e)
{
int j = 1;
LinkNode p ;
p = L ;
while( p && j<i)
{
p = p->next ;
++j ;
}
if( !p || j > i)
return ERROR ;
*e = p->data ;
return OK ;
}
Status ListInsert(LinkList * L , int i , ElemType e) //在第i个位置上插入元素e
{
LinkList P , S ;
P = *L ;
int j = 1 ;
while( P && j<i-1)
{
P = P->next ;
++j ;
}
S = (LinkList)malloc(sizeof(Node)) ;
S->data = e ;
S->next = P->next ;
P->next = S ;
return OK ;
}
Status LinkListDelete(LinkList *L , int i , ElemType *e)
{
LinkList p , q ;
p = *L ;
int j = 1 ;
while(p && j<i-1)
{
p = p ->next ;
++j ;
}
if(!p->next || j>i) return ERROR ;
q = p->next ;
p->next = q->next ;
*e = q->data;
free(q) ;
return OK ;
}
暂时写到这里,后面有什么再补充。有错误请大家指出。