c语言里的线性结构,考研笔记数据结构线性结构之C语言

一千个教程又一千种说法。数据结构的教材上都是伪代码。那么我认为写汉语也行咯。干脆全部用标准代码敲下来。到时候背一下。专业课其实就是在考背诵。

手头没有编译器希望大家能够提出意见。

约定

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;

}

}

双链表。循环链表的不再写代码。都差不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值