本文最后更新于:2 年前
数据结构课程的自我复习顺带练练手敲敲代码,有兴趣的可以点进来康康嗷!
关于线性表的一些题目:
如何删除一个顺序表中的所有特定元素(时间复杂度为n,空间复杂度为1):
> 首先的想法一个个找,但是顺序表的时间耗费主要在移动元素的过程中,可否不通过每次移动元素的方式来实现呢?
结论是可以的,利用同一个顺序表,设置两个位置的指针来对元素进行再操作即可,不用新的任何的东西。(前面遍历过的表可以被现有的数据覆盖形成新的表)
1 2 3 4 5 6 7 8 9
| void delx(SeqList *L,ElemType x){ i = 0; j = 0 while(i<=L->last){ if(L->elem[i]!=x){L->elem[j]=L->elem[i];i++;j++} else i++; } L->last = j-1; }
|
逆置带头结点的单链表:
>利用头插法和尾插法的特点是可以进行实现的。
1 2 3 4 5 6 7 8 9 10
| void ReverList(LinkList L){ p = L->next; L->next = NULL while(p!=NULL){ q = p->next; p->next = L->next; L->next = p; p = q; } }
|
以第一个元素大小为标准,小的放左边,大的放在右边:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void changeList(LinkList L){ if(L->next==NULL) return ERROR; p1 = L->next; pre = p1; p = p1->next; while(p){ if(p->data>=p1->data){ pre = p; p = p->next; } else{ pre->next = p->next; p->next = L->next; L->next = p; p = pre->next; } } }
|
将二进制数字用线性链表储存:
操作规则:
1.储存:第一个结点存最高位,依次储存,最后一个结点储存二进制数字的最低位。
2.加法规则:从低到高找到第一个值为0的位置,从该位开始,对于所有低位求反运算。(这个是核心,注意一下嗷!)
3.实现:高位往低位运算的方向正好反过来,找出最后一个位为0的结点,其赋值为1,其后的1,全部赋值为0.
4.特殊情况:全部都是1的时候,这时候加法就应该,申请一个新的结点(头插法),值赋予1,其余后面各位赋值为0;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| void BinAdd(LinkList L){ Node *p,*r; Node *s; q = l->next; r = l; while(q!=NULL){ if(q->data==0) r = q; q = q->next; } if(r!=l) r->data = 1; else{ s = (Node*)malloc(sizeof(Node)); s->data = 1; s->next = L->next; L->next = s; r = s; } r = r->next; while(r!=NULL){ r->data = 0; r = r->next; } }
|
其余线性表知识:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
int Locate(SeqList L, ElemType e) { int i = 0; while (i <= L.last) { if (L.elem[i] == e) { return i; } i++; }
return -1; }
int InsList(SeqList *L, int i, ElemType e) { int k; if (L->last == MAXSIZE - 1) return false; if (i < 1 || i > L->last + 2) return false;
for (k = L->last; k >= i - 1; k--) { L->elem[k + 1] = L->elem[k]; } L->elem[i - 1] = e; return true; }
int DelList(SeqList *L, int i, ElemType e) { if (L->last == 0) { printf("表中没有元素,无法删除。"); return false; }
if (i - 1 < 0 || i - 1 > L->last) return false;
for (int k = i; k <= L->last; k++) { L->elem[k - 1] = L->elem[k]; } L->last--; return true; }
void mergeList(SeqList *LA, SeqList *LB, SeqList *LC)
|