基本数据结构
Posted 醉风晨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本数据结构相关的知识,希望对你有一定的参考价值。
本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处http://www.cnblogs.com/a1982467767/p/8893542.html
基础数据结构对应的头文件
1.顺序表
1 //linklist.h 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<string.h> 6 #define MAXSIZE 100 7 //顺序表结构体定义 8 typedef struct node { 9 int data[MAXSIZE]; 10 int length; 11 }SeqList, *PSeqList; 12 //函数申明区 13 PSeqList Init_SeqList(void);//创建一个顺序表 14 PSeqList Input_SeqList(PSeqList L, char a[]);//将数据输入到顺序表中 15 int Length_SeqList(PSeqList L);//获得表长度 16 int Location_SeqList(PSeqList L, int x);//查找,定位数据的位置 17 int Insert_SeqList(PSeqList PL, int i, int x);//在顺序表中插入 18 int Delete_SeqList(PSeqList PL, int i);//删除第i个元素 19 void Output_SeqList(PSeqList PL);//输出顺序表 20 //创建一个顺序表,入口参数无,返回一个指向顺序表的指针,指针值为零表示分配空间失败 21 PSeqList Init_SeqList(void) 22 { 23 PSeqList PL; 24 PL = (PSeqList)malloc(sizeof(SeqList)); 25 if (PL) 26 PL->length = 0; 27 else 28 { 29 printf("内存分配失败\\n"); 30 exit(-1); 31 } 32 return (PL); 33 } 34 //数据输入 35 PSeqList Input_SeqList(PSeqList L, char a[]) 36 { 37 int i, a_length = 0; 38 a_length = strlen(a); 39 for (i = 0; i < a_length; i++) 40 L->data[i] = (int)a[i] - 48;//将char型整数转换成int型整数 41 L->length = i; 42 return L; 43 } 44 //读取顺序表的当前长度 45 int Length_SeqList(PSeqList L) 46 { 47 if (!L) 48 { 49 printf("无PL指针,退出程序\\n"); 50 exit(-1); 51 } 52 return (L->length); 53 } 54 //在顺序表上检索,入口参数为顺序表,检索元素,返回元素位置,0表示查找失败 55 int Location_SeqList(PSeqList L, int x) 56 { 57 int i = 0; 58 while (i < L->length && L->data[i] != x) 59 i++; 60 if (i >= L->length) 61 return 0; 62 else 63 return (i + 1); 64 } 65 /*在顺序表的第i个元素之前插入x,入口参数为顺序表指针,插入位置,插入元素, 66 返回标志,1表示成功,0标志插入位置不合法,-1表示溢出,-2表示不存在*/ 67 int Insert_SeqList(PSeqList PL, int i, int x) 68 { 69 int j; 70 if (!PL) 71 { 72 printf("表不存在!\\n"); 73 return (-2); 74 } 75 if (PL->length >= MAXSIZE) 76 { 77 printf("表溢出\\n"); 78 return (-1); 79 } 80 if (i < 1 || i >(PL->length + 1)) 81 { 82 printf("插入位置不合法......\\n"); 83 return (0); 84 } 85 for (j = PL->length - 1; j >= i - 1; j--) 86 PL->data[j + 1] = PL->data[j]; 87 PL->data[i - 1] = x; 88 PL->length++; 89 return 1; 90 } 91 //删除顺序表第i个元素,入口参数:顺序表指针,删除元素位置,返回标志1表示成功,0表示删除位置不合法,-1表示表不存在 92 int Delete_SeqList(PSeqList PL, int i) 93 { 94 int j; 95 if (!PL) 96 { 97 printf("表不存在!\\n"); 98 return (-1); 99 } 100 if (i<1 || i > PL->length) 101 { 102 printf("删除位置不合法!\\n"); 103 return (0); 104 } 105 for (j = i; j < PL->length; j++) 106 PL->data[j - 1] = PL->data[j]; 107 PL->length--; 108 return (1); 109 }
2.单链表
1 //线性表链式结构 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 //主要申明区间 6 void Mum();//菜单函数 7 LinkList Create_Linklist(void);//创建链表函数申明 8 LinkList Insert_Linklist(LinkList head);//插入链表函数申明 9 LinkList Delete_Linklist_Data(LinkList head);//以data进行删除 10 LinkList Deleterepeat(LinkList head);//删除重复数据 11 LinkList Search_Linklist_Data(LinkList head);//以data在链表上查找 12 LinkList Sort_Data(LinkList head);//按照数据从小到大的顺序排序 13 LinkList Output_Linklist(LinkList head);//链表的遍历,数据输出 14 LinkList Reverse_Linklist(LinkList head);//链表倒序 15 void CountNumber_Linklist(LinkList head);//计算链表数据的长度 16 void Distory(LinkList *h);//线性表的销毁 17 void Mum() 18 { 19 printf("------------------------------------------------------------------------------------------------------"); 20 printf("请输入以下指令操作:\\n"); 21 printf("\\t\\t\\t\\t1------插入数据\\t"); 22 printf("4------删除数据\\n"); 23 printf("\\t\\t\\t\\t2------查找数据\\t"); 24 printf("5----------排序\\n"); 25 printf("\\t\\t\\t\\t3----------输出\\t"); 26 printf("6------计算长度\\n"); 27 printf("\\t\\t\\t\\t7----------倒序\\t"); 28 printf("8------删除重复\\n"); 29 printf("----------------------删除重复指令需要在排序指令操作之后,才可以准确的删除---------------------------\\n"); 30 //为考虑删除数据所需的时间,在排序完在执行,更加便捷 31 } 32 /*创建一个以data为元素链表,按data升序排列,以-1输入为建立结束*/ 33 LinkList Create_Linklist(void) 34 { 35 int x; 36 LinkList head, s, r; 37 head = (ListNode*)malloc(sizeof(ListNode)); /*为头结点head申请空间*/ 38 if (!head)//内存分配判断 39 { 40 printf("内存申请失败,程序退出......\\n"); 41 exit(-1); 42 } 43 r = head; 44 r->next = NULL; 45 printf("请按data升序输入,以-1输入为结束\\n"); 46 printf("请输入一个data:"); 47 scanf("%d", &x); 48 while (x != -1) 49 { 50 s = (ListNode*)malloc(sizeof(ListNode));/*为添入结点申请空间*/ 51 if (!s)//内存分配判断 52 { 53 printf("内存申请失败,程序退出......\\n"); 54 exit(-1); 55 } 56 s->data = x; 57 s->next = r->next; 58 r->next = s;/*这两句表示将新创建的s结点连接到r结点的后面,r初次对应的head并没有数据,所以head是含有空头的链表,画图可以更方便理解*/ 59 r = s;/*用r将新定义的结点s取代,这样可以使用s进行反复连接*/ 60 printf("请输入下一个data:"); 61 scanf("%d", &x); /*输入下一个data*/ 62 } 63 return head; 64 } 65 /*在链表head上插入数据*/ 66 LinkList Insert_Linklist(LinkList head) 67 { 68 int x; 69 ListNode *p, *s; 70 printf("请输入要插入的data:"); 71 scanf("%d", &x); /*输入要插入的data*/ 72 p = head; /*P指向链表的头结点*/ 73 while (p->next && x > p->next->data)/*查找插入位置的前一个位置*/ 74 { 75 p = p->next; 76 } 77 if (p->next != NULL && x == p->next->data) /*数据已,有不能插入*/ 78 printf("重复插入,不允许。\\n"); 79 else/*插入位置正确*/ 80 { 81 s = (ListNode *)malloc(sizeof(ListNode)); /*为插入结点申请空间。*/ 82 if (!s)//内存分配判断 83 { 84 printf("内存申请失败,程序退出......\\n"); 85 exit(-1); 86 } 87 s->data = x; 88 s->next = p->next; /*将插入结点s插到p的后面*/ 89 p->next = s; /*这两句是插入结点的固定模式,先将p的结点域给s的结点域,然后再将s的头与p的结点相接*/ 90 /*这样就实现了链表的插入链接*/ 91 } 92 return head; 93 } 94 LinkList Delete_Linklist_Data(LinkList head) 95 { 96 int count = 0; 97 int x; 98 ListNode *p, *r; 99 if (head->next == NULL)//链表数据为空判断 100 { 101 printf("链表为空,无法进行删除,请尝试其他指令......\\n"); 102 return head; 103 } 104 printf("请输入要删除的data:"); 105 scanf("%d", &x); /*输入要删除的data*/ 106 p = head; 107 r = head->next; 108 while (r)//执行r次循环,如果有r个相同的数据,则都可以删除 109 { 110 p = head; 111 r = head->next; 112 while (r && x != r->data) /*查找要删除的data*/ 113 { 114 p = r; 115 r = r->next; /*依次将p,r后移一个结点*/ 116 } 117 if (r == NULL) 118 { 119 if (count == 0)/*没有找到要删除的data*/ 120 printf("没有找到要删除的data......\\n"); 121 } 122 else /*找到要删除的data,进行删除*/ 123 { 124 p->next = r->next;/*删除时直接将要删除的前一个结点指向要删除的结点,就可以进行删除*/ 125 /*这里要删除的结点是r*/ 126 free(r); 127 count++; 128 } 129 } 130 if (count != 0) 131 printf("找到要删除的data......\\n"); 132 return head; 133 } 134 //删除重复数据 135 LinkList Deleterepeat(LinkList head) 136 { 137 /*LinkList p,r; 138 p = head->next; 139 r = p->next; 140 while (1) 141 { 142 while (r && p->data != r->data) //查找要删除的data 143 { 144 p = r; 145 r = r->next; //依次将p,r后移一个结点* 146 } 147 if(r == NULL) 148 break; 149 if(p->data == r->data) //找到要删除的data,进行删除 150 { 151 p->next = r->next;//删除时直接将要删除的前一个结点指向要删除的结点,就可以进行删除 152 //这里要删除的结点是r 153 free(r); 154 r = p->next; 155 } 156 }*/ 157 LinkList p, r, q; 158 p = head->next; 159 while (p->next) 160 { 161 q = p; 162 while (q->next) 163 { 164 r = q->next; 165 if (p->data == r->data) 166 { 167 q->next = r->next; 168 free(r); 169 } 170 if (q->next != NULL) 171 q = q->next; 172 } 173 p = p->next; 174 } 175 return head; 176 } 177 LinkList Search_Linklist_Data(LinkList head) 178 { 179 int x; 180 ListNode *p, *r;/*定义两个链表类型的指针表示相连的两个结点*/ 181 if (head->next == NULL)//链表数据为空判断 182 { 183 printf("链表为空,无法进行查找,请尝试其他指令......\\n"); 184 return head; 185 } 186 printf("请输入要查找的data:"); 187 scanf("%d", &x);/*输入要查找的data*/ 188 p = head; 189 r = head->next; 190 while (r && x != r->data) /*查找要查找的data*/ 191 { 192 p = r; 193 r = r->next;/*依次将p,r后移一个结点*/ 194 } 195 if (r == NULL) 196 printf("没有找到要查找的data......\\n\\n"); /*没有找到要查找的data*/ 197 else 198 { 199 printf("存在该查找的数据......\\n"); 200 p = head; 201 r = head->next; 202 while (r && x != r->data) /*查找要查找的mob_phono*/ 203 { 204 p = r; 205 r = r->next;/*依次将p,r后移一个结点*/ 206 } 207 if (r) 208 { 209 printf(" 该数据为: %d \\n", r->data); 210 r = r->next; 211 } 212 } 213 return head; 214 } 215 //排序 216 LinkList Sort_Data(LinkList head) 217 { 218 int temp; 219 if (head->next == NULL)//链表为空判断 220 { 221 printf("无数据不执行排序......\\n"); 222 return head; 223 } 224 int i, j, count = 0; 225 LinkList p = (LinkList)malloc(sizeof(ListNode)); 226 if (!p)//内存分配判断 227 { 228 printf("内存分配失败,程序中断......\\n"); 229 exit(-1); 230 } 231 p = head->next; 232 while (p) 233 { 234 count++; 235 p = p->next; 236 } 237 for (j = 0; j<count - 1; j++) 238 { 239 p = head->next; 240 for (i = 0; i<count - j - 1; i++) 241 { 242 if (p->data > p->next->data) 243 { 244 temp = p->data; 245 p->data = p->next->data; 246 p->next->data = temp; 247 } 248 p = p->next; 249 } 250 } 251 return head; 252 } 253 /*输出链表head中的所有数据元素*/ 254 LinkList Output_Linklist(LinkList head) 255 { 256 ListNode *p; 257 int i = 0; 258 p = head->next; 259 if (head->next == NULL)//链表为空判断 260 { 261 printf("链表中没有数据......\\n"在Android中将数据从基本活动发送到片段[重复]