基本数据结构

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中将数据从基本活动发送到片段[重复]

(转) Java中的负数及基本类型的转型详解

Android 使用两个不同的代码片段获取当前位置 NULL

片段内带有基本适配器的列表视图

如何从片段外部清除/重置地图?

JavaScript 代码片段