一千个教程又一千种说法。数据结构的教材上都是伪代码。那么我认为写汉语也行咯。干脆全部用标准代码敲下来。到时候背一下。专业课其实就是在考背诵。
手头没有编译器希望大家能够提出意见。
约定
Code:
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define OK 1
线性表
静态线性表
书上的方法
Code:
#define maxSize 100 //显示定义表的长度
typedefintElemType;//数据类型为int型
typedefstruct{
ElemType elem[maxSize];//静态分配存储表元素的数组
intlength;//实际表元素的数组
}SqList; //别名
我的想法
Code:
#define maxSize 100 //显示定义表的长度
typedefintElemType;//数据类型为int型
typedefstruct{
ElemType elem[maxSize+1];//静态分配存储表元素的数组
}SqList;
//实际的取第一个数组元素。也就是下标为0的用于存储表实际元素的个数
想法是想法。阅卷老师可不一定这么想。后面的都按照阅卷老师的来。
创建静态线性表
Code:
ElemType InitList Sq(SqList &L){
L.elem(ElemType* ) malloc (maxSize*sizeof(ElemType) );//分配空间
if(!L.elem)//内存不够就报错
{returnERROR;}
else{//否则继续
L.length=0;//初始化。实际使用长度为0
returnOK;
}
}
删除静态线性表中第i个元素
Code:
ElemType DelSq(SqList &L;inti){
if( i<1 || i>L.length+1)//判断是否合法输入
{returnOVERFLOW;}
else
{
ElemType *q=&(L.elem [ i-1 ] ) ;//标记位置
for( q ;q<=( L.length-1) ; q++ )//还不知道为啥-1.估计是从0开始的数组
{*( q-1 )=*q;}
L.length--;
returnOK;
}//end else
}
查找值为x的元素的位置
Code:
ElemType SelectSq(SqList L; ElemType x){
inti=0;
while(i<=L.length-1&&L.elem[ i ] !=x)
{i++;}
if( i>L.length-1;)
{returnERROR;}
else
{returni;}
}
/**这里其实有个问题。如果第一个是那么返回的就是0和返回ERROR是一样 的。但是在这里高教出版社的大纲解析没有讲。而文都的和恩波的考研都是这么处理的。如果大家认为合理则留言。以后数组统一第一位空。长度为maxSize+1;直接用数表示位数。*/
在第i个元素的位置插入x
Code:
ElemType InsertSq(SqList &L;inti){
if( i<1 || i>L.length+1)//判断是否合法输入
{returnERROR;}
if( L.length>=maxSize) //判断是否空间够用
{returnOVERFLOW;}
else
{
ElemType *p=&(L.elem [ i-1 ] ) ;//标记位置
ElemType *q=&(L.elem [ length-1 ] ) ;
for( q ;q<=( L.length-1) ; q++ )//还不知道为啥-1.估计是从0开始的数组
{*( q+1 )=*q;}
*p=e;
L.length++;
returnOK;
}//end else
}
动态线性表就是空间不够了可以再分配。这个手头暂时看不到例子。这个暂时pause。
链表
单链表
特别说明。所有的单链表都带有头结点
Code:
typedefstructLNode{
int data;//数据域
structureLNode *next;//指针域 特别说明考研喜欢用link代替next
}LNode,*LinkList;
LinkList L;//L为单链表的头指针
节点插入
头插法(类似栈,后进先出)
Code:
LinkList CreateHeadLinkList(){
LickList L->next=NULL;
LNode *s;
intx;
scanf("%d",&x );
while( x!=flag)//flag为输入结束的标准
{
s=( LNode* ) malloc (sizeof(LNode ) );
if(!s)
{
returnOVERFLOW;
}//end if
s->data=x;
s->next=L->next;
L->next=s;
}//end while
returnL;
}
尾插法
Code:
LinkList CreatTailLinkList(){
LinkList L=(LNode)malloc(sizeof( LNode ) );
if(!L)//查看空间是否够用
{returnOVERFLOW;}
LNode *s,*r=NULL;//r是尾指针
intx;
scanf("%d",&x)
while(x!=flag)//flag是结束输入的标记
{
s=(LNode)malloc(sizeof( LNode ) );
if(!s)//查看空间是否够用
{returnOVERFLOW;}
s->data=x;
r->next=s;
r=s;//r指向新结尾
scanf("%d",&x);
}//endwhile
r->next=NULL;
returnL;
}
求表长
Code:
intLengthLinkList(LinkList L){
LNode *p=L;//p指向头结点
intj=0;
while(p->next)
{
p=p->next;
j++
}
returnj;
}
查找
按序号查找
Code:
LNode *GetNoLink(LinkList L,intx);{
//在L中查找如果找到返回指针否则返回空
LNode *p=L;//指向表头
intj=0;
while(p-next!=NULL&&j
{
p=p->next;
j++;
}
if(j==i){returnp;}
else{returnNULL;}
}
按值查找
Code:
LNode *SelectLocateLinkList(LinkList L,intx){
//在单链表中查找值找到返回指针否则返回空
LNode *p=L->next;
while(p!=NULL&&p->data!=x)
{p=p->next;}
returnp;
}
插入
在p之后后插
1.找到位置。(使用p的指针)
2.申请空间
3.插入
假设插入的值是s位置是p的后面则
s->next=p->next;
p->next=s;
在p之前插
1.找到位置。假设是q(p指针的前面一个指针。只能遍历了)
2.申请空间
3.插入
s->next=p;
q->next=s;
删除
删除p
1.找到p
2.删除。
Code:
intDelLInk(LinkList L;inti){
//删除第i个元素
LinkList p,s;
p=Get
if(NULL==p&&NULL==p->next)
{returnNULL;}
else
{
s=p->next;
p->next=s->next;
free (s);
returnOK;
}
}
双链表。循环链表的不再写代码。都差不多。