对线性结构的总复习
PS:主要就是将线性结构的代码实现再回顾一遍
经过一段时间线性结构的学习,想着总结一下这段时间的学习,主要就是分为几个方面,对线性结构的最开始的认知,以及在后面进行的线性结构的一些基础应用。
1.线性顺序表
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 typedef struct SqList { 6 int *pBase; 7 int length; 8 int listsize; 9 }*PSQLIST; 10 11 12 void init(PSQLIST pArr); 13 bool emptyArr(PSQLIST pArr); 14 void traverse(PSQLIST pArr); 15 bool fullArr(PSQLIST pArr); 16 bool append(PSQLIST pArr,int val); 17 bool insert(PSQLIST pArr,int pos,int val); 18 bool deleteAyy(PSQLIST pArr,int pos,int *val); 19 20 int main(void) { 21 22 //如果直接使用PSQLIST进行定义的话,所初始化的话就不是一个完整的数组了,而是一个地址所以要先使用SqList定义一个数组 23 int val; 24 SqList Arr; 25 init(&Arr); 26 traverse(&Arr); 27 append(&Arr,1); 28 append(&Arr,2); 29 append(&Arr,3); 30 append(&Arr,4); 31 traverse(&Arr); 32 insert(&Arr,3,3333); 33 traverse(&Arr); 34 deleteAyy(&Arr,3,&val); 35 printf("删除掉的数是:%d\n",val); 36 traverse(&Arr); 37 return 0; 38 } 39 40 //初始化一个数组 41 void init(PSQLIST pArr) { 42 int len; 43 printf("请输入数组的个数:"); 44 scanf("%d",&len); 45 printf("\n"); 46 pArr->pBase = (int*)malloc(sizeof(int)*len); 47 48 if(NULL == pArr->pBase) { 49 printf("内存分配失败!\n"); 50 exit(-1); 51 } else { 52 pArr->length = len; 53 pArr->listsize = 0; 54 } 55 } 56 57 void traverse(PSQLIST pArr) { 58 if(emptyArr(pArr)) { 59 60 } else { 61 for(int i=0; i<pArr->listsize; i++) { 62 printf("%d ",pArr->pBase[i]); 63 } 64 } 65 printf("\n"); 66 } 67 //判断数组是否为空 68 bool emptyArr(PSQLIST pArr) { 69 if(0 == pArr->listsize) { 70 printf("数组为空 !\n"); 71 return true; 72 } else { 73 return false; 74 } 75 } 76 //判断一个数组是否已满 77 bool fullArr(PSQLIST pArr) { 78 if(pArr->length == pArr->listsize) { 79 printf("数组已满!\n"); 80 return true; 81 } else { 82 return false; 83 } 84 } 85 //向数组中追加元素 86 bool append(PSQLIST pArr,int val) { 87 if(fullArr(pArr)) { 88 return false; 89 } else { 90 pArr->pBase[pArr->listsize] = val; 91 pArr->listsize++; 92 return true; 93 } 94 } 95 //向数组中插入元素 96 bool insert(PSQLIST pArr,int pos,int val) { 97 if(pos < 1 || pos > pArr->listsize) { 98 printf("没有符合的位置!\n"); 99 return false; 100 } 101 102 103 if(fullArr(pArr)) { 104 return false; 105 } 106 107 for(int i=pArr->listsize-1; i>=pos-1; i--) { 108 pArr->pBase[i+1] = pArr->pBase[i]; 109 } 110 pArr->pBase[pos-1] = val; 111 pArr->listsize++; 112 return true; 113 114 115 } 116 bool deleteAyy(PSQLIST pArr,int pos,int *val) { 117 118 if( pos < 1 || pos > pArr->listsize-1) { 119 printf("插入的位置错误!\n"); 120 return false; 121 } 122 if(emptyArr(pArr)) { 123 return false; 124 } else { 125 126 *val = pArr->pBase[pos-1]; 127 128 for(int i =pos; i<pArr->listsize; i++) { 129 pArr->pBase[i-1] = pArr->pBase[i]; 130 } 131 132 pArr->listsize--; 133 return true; 134 } 135 }
2.线性链表
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 //先定义结点的类型 6 typedef struct Node { 7 int data; 8 9 struct Node* pNext; 10 11 } NODE,*PNODE; 12 PNODE createList(); 13 void traverse(PNODE pHead); 14 bool emptyList(PNODE pHead); 15 void sortList(PNODE pHead); 16 17 18 int main(void) { 19 PNODE pHead = NULL;//先定义一个无实际意义的指针 20 pHead = createList(); 21 traverse(pHead); 22 sortList(pHead); 23 traverse(pHead); 24 25 return 0; 26 } 27 PNODE createList() { 28 //首先,弄出一个头结点 29 PNODE pHead = NULL; 30 pHead = (PNODE)malloc(sizeof(NODE)); 31 if(NULL == pHead) { 32 printf("内存分配失败!\n"); 33 exit(-1); 34 } 35 pHead->pNext = NULL; //如果需要使用头插法的话 就必须要将指向第一个有效元素的指针定为空 36 int len; 37 printf("请输入需要的参数len="); 38 scanf("%d",&len); 39 printf("\n"); 40 PNODE pNew; 41 PNODE pTail = pHead; 42 int val; 43 for(int i=0; i<len; i++) { 44 printf("请输入值:"); 45 scanf("%d",&val); 46 pNew = (PNODE)malloc(sizeof(NODE)); 47 pNew->pNext=NULL; 48 pNew->data = val; 49 //尾插法 50 // pTail->pNext = pNew; 51 // pNew->pNext = NULL; 52 // pTail = pNew; 53 //头插法 54 pNew->pNext = pHead->pNext; 55 pHead->pNext = pNew; 56 } 57 return pHead; 58 59 60 } 61 void traverse(PNODE pHead) { 62 PNODE p = pHead->pNext; 63 while(NULL != p) { 64 printf("%d ",p->data); 65 p = p->pNext; 66 } 67 printf("\n"); 68 return; 69 } 70 bool emptyList(PNODE pHead) { 71 if(NULL == pHead->pNext) { 72 printf("链表为空!\n"); 73 return true; 74 } else { 75 return false; 76 } 77 } 78 int lengthList(PNODE pHead) { 79 PNODE p = pHead->pNext; 80 int length; 81 while(NULL != p) { 82 length++; 83 p = p->pNext; 84 } 85 return length; 86 } 87 // 对链表进行排序 88 void sortList(PNODE pHead) { 89 int i,j,t; 90 int len = lengthList(pHead); 91 PNODE p,q; 92 93 //i和j控制循环次数 p和q控制指针的移动 94 for(i=0,p=pHead->pNext; i<len-1; i++, p=p->pNext) { 95 for(j=i+1,q=p->pNext; j<len; j++,q=q->pNext) { 96 if(p->data>q->data) { 97 t = p->data; 98 p->data = q->data; 99 q->data = t; 100 } 101 } 102 } 103 return; 104 105 }
3.栈的实现
栈的思想主要就是一个链表设置了只能在一个口子进行删除或者是添加,这个动作就是被叫做压栈和出栈。
代码实现:
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 6 //使用链表去是实现栈 7 typedef struct Node { 8 int data; 9 struct Node * pNext; 10 } NODE,*PNODE; 11 //定义栈需要的参数 12 typedef struct Stack { 13 PNODE pTop; 14 PNODE pBottom; 15 } STACK,*PSTACK; 16 17 void init(PSTACK pS); 18 void push(PSTACK pS,int val); 19 void traverse(PSTACK pS); 20 bool emptyStack(PSTACK pS); 21 bool pop(PSTACK pS,int *val); 22 void clearStack(PSTACK pS); 23 24 int main(void) { 25 26 int val; 27 STACK S; 28 init(&S); 29 push(&S,1); 30 push(&S,2); 31 push(&S,3); 32 push(&S,4); 33 traverse(&S); 34 if(pop(&S,&val)) { 35 printf("出栈的数是%d\n",val); 36 } 37 traverse(&S); 38 clearStack(&S); 39 traverse(&S); 40 return 0; 41 } 42 43 void init(PSTACK pS) { 44 pS->pTop = (PNODE)malloc(sizeof(NODE)); 45 if(NULL == pS->pTop) { 46 printf("动态内存分配失败!\n"); 47 exit(-1); 48 } else { 49 pS->pBottom = pS->pTop; 50 pS->pTop->pNext = NULL; 51 } 52 return; 53 } 54 void traverse(PSTACK pS) { 55 PNODE p = pS->pTop; 56 while(p!=pS->pBottom) { 57 printf("%d ",p->data); 58 p = p->pNext; 59 } 60 printf("\n"); 61 return; 62 63 } 64 65 //压栈也就是使用头插法 66 void push(PSTACK pS,int val) { 67 68 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 69 if(NULL == pNew->pNext) { 70 printf("内存分配失败!\n"); 71 exit(-1); 72 } 73 pNew->pNext = NULL; 74 pNew->data = val; 75 pNew->pNext = pS->pTop; 76 pS->pTop = pNew; 77 return; 78 } 79 //判断一个栈是不是空战主要就是使用bottom和Top是否相等 80 bool emptyStack(PSTACK pS) { 81 if(pS->pTop == pS->pBottom) { 82 printf("空栈\n"); 83 return true; 84 } else { 85 return false; 86 } 87 } 88 //出栈 89 bool pop(PSTACK pS,int *val) { 90 if(emptyStack(pS)) { 91 printf("栈为空\n"); 92 return false; 93 } else { 94 PNODE p = pS->pTop; 95 *val = p->data; 96 pS->pTop = p->pNext; 97 free(p); 98 p = NULL; 99 return true; 100 } 101 } 102 // 清空里面的栈 103 void clearStack(PSTACK pS) { 104 if(emptyStack(pS)) { 105 return; 106 } else { 107 PNODE p; 108 p = pS->pTop; 109 PNODE q = NULL; 110 while (p!=pS->pBottom) { 111 q = p->pNext; 112 free(p); 113 p = q; 114 } 115 pS->pTop = pS->pBottom; 116 } 117 }
4.队列
队列这里我们所指的就是循环数组队列。主要是基本操作的使用。
代码演示
1 #include <stdio.h> 2 #include <malloc.h> 3 #include <stdlib.h> 4 5 typedef struct Queue { 6 int *pBase; 7 int front; 8 int rear; 9 } QUEUE,*PQUEUE; 10 11 void init(PQUEUE pQ); 12 bool enQueue(PQUEUE pQ,int val); 13 bool fullQueue(PQUEUE pQ); 14 bool emptyQueue(PQUEUE pQ); 15 bool outQueue(PQUEUE pQ,int *val); 16 bool traverse_Queue(PQUEUE pQ); 17 18 int main(void) { 19 int val; 20 QUEUE pQ; 21 init(&pQ); 22 enQueue(&pQ,1); 23 enQueue(&pQ,2); 24 enQueue(&pQ,3); 25 if(traverse_Queue(&pQ)) { 26 printf("为空!\n"); 27 } 28 if(outQueue(&pQ,&val)) { 29 printf("出队成功!出队的值为%d!\n",val); 30 } else { 31 printf("为空!\n"); 32 } 33 if(traverse_Queue(&pQ)) { 34 printf("为空!\n"); 35 } 36 return 0; 37 38 return 0; 39 } 40 41 void init(PQUEUE pQ) { 42 pQ->pBase = (int *)malloc(sizeof(int)*6); 43 pQ->front = 0; 44 pQ->rear = 0; 45 } 46 47 bool traverse_Queue(PQUEUE pQ) { 48 if(emptyQueue(pQ)) { 49 return true; 50 } else { 51 int i = pQ->front; 52 while(i != pQ->rear) { 53 printf("%d ",pQ->pBase[i]); 54 i = (i+1)%6; 55 } 56 printf("\n"); 57 return false; 58 } 59 } 60 61 62 //入队 63 bool enQueue(PQUEUE pQ,int val) { 64 if(fullQueue(pQ)) { 65 return false; 66 } else { 67 pQ->pBase[pQ->rear] = val; 68 pQ->rear = (pQ->rear+1)%6; 69 return true; 70 } 71 } 72 //判断是不是已经满了 73 bool fullQueue(PQUEUE pQ) { 74 if(((pQ->rear+1)%6 == pQ->front)) { 75 return true; 76 } else { 77 return false; 78 } 79 } 80 //判空 81 bool emptyQueue(PQUEUE pQ) { 82 if(pQ->front == pQ->rear) { 83 return true; 84 } else { 85 return false; 86 } 87 } 88 //出栈 89 bool outQueue(PQUEUE pQ,int *val) { 90 if(emptyQueue(pQ)) { 91 printf("栈表为空!\n"); 92 return false; 93 } else { 94 *val = pQ->pBase[pQ->front]; 95 pQ->front = (pQ->front+1)%6; 96 return true; 97 } 98 }
PS:总结,对于线性结构,就是能使用一根线将之穿起来的结果,主要就是着一些基本的操作了。如果在上述代代码中发现了错误或者是问题,请@楼主。