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