考研笔记数据结构线性结构之C语言

来源:互联网 发布:二值化算法matlab 编辑:程序博客网 时间:2024/05/21 06:41

 

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

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

约定

Code:
  1. #define TRUE 1         
  2. #define FALSE 0         
  3. #define ERROR 0         
  4. #define INFEASIBLE -1         
  5. #define OVERFLOW -2       
  6. #define OK 1  
 

 

 

线性表

静态线性表

书上的方法

Code:
  1. #define maxSize 100       //显示定义表的长度   
  2. typedef int ElemType;     //数据类型为int型   
  3. typedef struct{                   
  4. ElemType elem[maxSize];//静态分配存储表元素的数组   
  5. int length;                         //实际表元素的数组   
  6. }SqList;  //别名

我的想法

Code:
  1. #define maxSize 100       //显示定义表的长度      
  2. typedef int ElemType;     //数据类型为int型      
  3. typedef struct{                      
  4. ElemType elem[maxSize+1];//静态分配存储表元素的数组      
  5. }SqList;     
  6. //实际的取第一个数组元素。也就是下标为0的用于存储表实际元素的个数  

想法是想法。阅卷老师可不一定这么想。后面的都按照阅卷老师的来。

创建静态线性表

Code:
  1. ElemType InitList Sq(SqList &L){   
  2. L.elem(ElemType* ) malloc (maxSize*sizeof(ElemType) );//分配空间   
  3. if(!L.elem)//内存不够就报错   
  4. {return ERROR;}   
  5. else{//否则继续   
  6.        L.length=0;//初始化。实际使用长度为0   
  7.        return OK;   
  8.        }   
  9. }  

删除静态线性表中第i个元素

Code:
  1. ElemType DelSq(SqList &L;int i){   
  2. if ( i<1 ||  i>L.length+1)                        //判断是否合法输入   
  3. {return OVERFLOW;}   
  4. else  
  5.  {   
  6.  ElemType *q=&(L.elem [ i-1 ] ) ;         //标记位置   
  7.  for( q ;q<=( L.length-1) ; q++ )            //还不知道为啥-1.估计是从0开始的数组   
  8.    {*( q-1 )=*q;}   
  9.  L.length--;   
  10.  return OK;    
  11.  }//end else   
  12. }  

查找值为x的元素的位置

Code:
  1. ElemType SelectSq(SqList L; ElemType x){   
  2. int i=0;   
  3. while(i<=L.length-1&&L.elem[ i ] !=x)   
  4. {i++;}   
  5. if( i>L.length-1;)   
  6.  {return ERROR;}   
  7. else  
  8.  {return i;}   
  9. }   
  10. /**这里其实有个问题。如果第一个是那么返回的就是0和返回ERROR是一样 的。但是在这里高教出版社的大纲解析没有讲。而文都的和恩波的考研都是这么处理的。如果大家认为合理则留言。以后数组统一第一位空。长度为maxSize+1;直接用数表示位数。*/  

 

在第i个元素的位置插入x

Code:
  1. ElemType InsertSq(SqList &L;int i){      
  2. if ( i<1 ||  i>L.length+1)                        //判断是否合法输入      
  3. {return ERROR;}                                  
  4. if ( L.length>=maxSize)                           //判断是否空间够用
  5. {return OVERFLOW;}   
  6. else     
  7.  {      
  8.  ElemType *p=&(L.elem [ i-1 ] ) ;                 //标记位置      
  9.  ElemType *q=&(L.elem [ length-1 ] ) ;   
  10.  for( q ;q<=( L.length-1) ; q++ )                 //还不知道为啥-1.估计是从0开始的数组      
  11.    {*( q+1 )=*q;}      
  12.  *p=e;   
  13.  L.length++;      
  14.  return OK;       
  15.  }//end else      
  16. }     

动态线性表就是空间不够了可以再分配。这个手头暂时看不到例子。这个暂时pause。

链表

单链表

特别说明。所有的单链表都带有头结点

Code:
  1. typedef struct LNode{   
  2. int data;               //数据域   
  3. structureLNode *next;     //指针域   特别说明考研喜欢用link代替next   
  4. }LNode,*LinkList;   
  5. LinkList L;                       //L为单链表的头指针  

节点插入

头插法(类似栈,后进先出)

Code:
  1. LinkList CreateHeadLinkList(){   
  2. LickList L->next=NULL;   
  3. LNode *s;   
  4. int x;   
  5. scanf( "%d" ,&x );   
  6. while( x!=flag)           //flag为输入结束的标准   
  7.  {   
  8.  s=( LNode* ) malloc ( sizeof(LNode ) );   
  9.  if(!s)   
  10.    {   
  11.     return OVERFLOW;   
  12.    }//end if   
  13.  s->data=x;   
  14.  s->next=L->next;   
  15.  L->next=s;   
  16.  }//end while   
  17.  return L;   
  18. }  

尾插法

Code:
  1. LinkList CreatTailLinkList(){   
  2. LinkList L=(LNode)malloc(sizeof ( LNode ) );   
  3. if (!L)                                                //查看空间是否够用   
  4. {return OVERFLOW;}   
  5. LNode *s,*r=NULL;                         //r是尾指针   
  6. int x;   
  7. scanf("%d",&x)   
  8. while(x!=flag)                                  //flag是结束输入的标记   
  9.  {   
  10.  s=(LNode)malloc(sizeof ( LNode ) );   
  11. if (!s)                                                //查看空间是否够用   
  12. {return OVERFLOW;}   
  13.  s->data=x;   
  14.  r->next=s;   
  15.  r=s;                                               //r指向新结尾   
  16.  scanf("%d",&x);   
  17.  }//endwhile   
  18. r->next=NULL;   
  19. return L;   
  20. }  

求表长

Code:
  1. int LengthLinkList(LinkList L){   
  2. LNode *p=L;                        //p指向头结点   
  3. int j=0;   
  4. while(p->next)   
  5. {   
  6.  p=p->next;   
  7.  j++   
  8.  }   
  9.  return j;   
  10. }   

查找

按序号查找

Code:
  1. LNode *GetNoLink(LinkList L,int x);{   
  2. //在L中查找如果找到返回指针否则返回空   
  3. LNode *p=L;//指向表头   
  4. int j=0;   
  5. while(p-next!=NULL&&j<i)   
  6. {   
  7.  p=p->next;   
  8.  j++;   
  9.  }   
  10.  if(j==i){return p;}   
  11.  else {return NULL;}   
  12. }  

按值查找

Code:
  1. LNode *SelectLocateLinkList(LinkList L,int x){   
  2. //在单链表中查找值找到返回指针否则返回空   
  3. LNode *p=L->next;   
  4. while(p!=NULL&&p->data!=x)   
  5.  {p=p->next;}   
  6. return p;   
  7. }  

插入

在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:
  1. int DelLInk(LinkList L;int i){   
  2. //删除第i个元素   
  3. LinkList p,s;   
  4. p=Get   
  5. if(NULL==p&&NULL==p->next)   
  6. {return NULL;}   
  7. else  
  8.  {    
  9.  s=p->next;   
  10.  p->next=s->next;   
  11.  free (s);   
  12.  return OK;   
  13.  }   
  14. }  

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

原创粉丝点击