基本数据结构

本篇文章中所有数据结构都是后期整理的,如有问题欢迎指正,转载请注明出处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");
262   return head;
263  }
264  while (p)
265  {
266   printf("%d  ", p->data);
267   p = p->next;/*p指向p的下一个结点*/
268  }
269  printf("\n");
270  return head;
271 }
272 //链表倒序
273 LinkList Reverse_Linklist(LinkList head)
274 {
275  LinkList p, q;
276  p = head->next;
277  head->next = NULL;
278  while (p)
279  {
280   q = p;
281   p = p->next;
282   q->next = head->next;
283   head->next = q;
284  }
285  return head;
286 }
287 void CountNumber_Linklist(LinkList head)//显示链表的长度
288 {
289  int count = 0;
290  LinkList s;
291  s = head->next;
292  while (s)
293  {
294   count++;
295   s = s->next;
296  }
297  printf("count = %d\n", count);
298 }
299 //销毁线性表
300 void Distory(LinkList *h)
301 {
302  LinkList p, q;
303  p = *h;
304  while (p)
305  {
306   q = p;
307   p = p->next;
308   free(q);
309  }
310  *h = NULL;
311  printf("销毁链表成功......\n");
312 }

 

3.循环链表

  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 }

 

4.顺序栈

 1 //seqstack.h
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #define MAXSIZE 100
 5 typedef int DataType;
 6 typedef struct {
 7  DataType data[MAXSIZE];
 8  int top;
 9 }SeqStack, * PSeqStack;
10 PSeqStack Init_SeqStack (void)
11 {
12  PSeqStack S;
13  S = (PSeqStack)malloc(sizeof(SeqStack));
14  if (S)
15   S->top = -1;
16  else
17   exit(-1);
18  return S;
19 }
20 int Empty_SeqStack(PSeqStack S)
21 {
22  //return (S->top==-1);
23  if (S->top == -1)
24   return 1;
25  else
26   return 0;
27 }
28 int Push_SeqStack(PSeqStack S,DataType x)
29 {
30  if (S->top == MAXSIZE - 1)
31  {
32   printf("栈满不能入栈\n");
33   return 0;
34  }
35  else 
36  {
37   S->top++;
38   S->data[S->top] = x;
39   return 1;
40  }
41 }
42 int Pop_SeqStack(PSeqStack S,DataType *x)
43 {
44  if(Empty_SeqStack(S))
45   return 0;
46  else
47  {
48   *x = S->data[S->top];
49   S->top--;
50   return 1;
51  }
52 }
53 int GetTop_SeqStack(PSeqStack S ,DataType *x)
54 {
55  if(Empty_SeqStack(S))
56   return 0;
57  else
58  {
59   *x = S->data[S->top];
60   return 1;
61  }
62 }
63 void Distory_SeqStack(PSeqStack *S)
64 {
65  if(*S)
66   free(*S);
67  *S = NULL;
68 }

 

5.链式栈

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef int DataType;
 4 typedef struct node{
 5  DataType data;
 6  struct node *next;
 7 }StackNode, * PStackNode;
 8 typedef struct {
 9  PStackNode top;
10 }LinkStack, * PLinkStack;
11 PLinkStack Init_LinkStack (void)
12 {
13  PLinkStack S;
14  S = (PLinkStack)malloc(sizeof(LinkStack));
15  if(S) 
16   S->top = NULL;
17  return S;
18 }
19 int Empty_LinkStack(PLinkStack S)
20 {
21  return (S->top==NULL);
22 }
23 int Push_LinkStack(PLinkStack S,DataType x)
24 {
25  PStackNode P;
26  P = (PStackNode)malloc(sizeof(StackNode));
27  if(!P)
28  {
29   printf("内存溢出");
30   return 0;
31  }
32  P->data = x;
33  P->next = S->top;
34  S->top = P;
35  return 1;
36 }
37 int Pop_LinkStack(PLinkStack S,DataType *x)
38 {
39  PStackNode P;
40  if(Empty_LinkStack(S))
41  {
42   printf("栈空,不能出栈\n");
43   return 0;
44  }
45  *x = S->top->data;
46  P = S->top;
47  S->top = S->top->next;
48  free(P);
49  return 1;
50 }
51 int GetTop_LinkStack(PLinkStack S,DataType *x)
52 {
53  if(Empty_LinkStack(S))
54  {
55   printf("栈空,不能出栈\n");
56   return 0;
57  }
58  *x = S->top->data;
59  return 1;
60 }
61 void Distroy_LInkStack(PLinkStack *S)
62 {
63  PStackNode P,Q;
64  if(*S)
65  {
66   P = (*S)->top;
67   while(P)
68   {
69    Q = P;
70    P = P->next;
71    free(Q);
72   }
73   free(*S);
74  }
75  *S = NULL;
76 }

 

6.顺序队列

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define MAXSIZE 100
 4 struct point{ 
 5  int row, col, predecessor; 
 6 };
 7 typedef point DataType;
 8 typedef struct {
 9  DataType data[MAXSIZE];
10  int front ,rear;
11 }SeqQueue,*PSeqQueue;
12 PSeqQueue Init_SeqQueue()
13 {
14  PSeqQueue Q;
15  Q = (PSeqQueue)malloc(sizeof(SeqQueue));
16  if(Q)
17  {
18   Q->front = 0;
19   Q->rear = 0;
20  }
21  return Q;
22 }
23 int Empty_SeqQueue(PSeqQueue Q)
24 {
25  if(Q && Q->front == Q->rear)
26   return 1;
27  else
28   return 0;
29 }
30 int In_SeqQueue(PSeqQueue Q,DataType x)
31 {
32  if((Q->rear + 1) % MAXSIZE == Q->front)
33  {
34   printf("队满\n");
35   return 0;
36  }
37  else
38  {
39   Q->rear = (Q->rear + 1) % MAXSIZE;
40   Q->data[Q->rear] = x;
41   return 1;
42  }
43 }
44 int Out_SeqQueue(PSeqQueue Q,DataType *x)
45 {
46  if(Empty_SeqQueue(Q))
47  {
48   printf("队空");
49   return 0;
50  }
51  else
52  {
53   Q->front = (Q->front + 1) % MAXSIZE;
54   *x = Q->data[Q->front];
55   return 1;
56  }
57 }
58 int Front_SeqQueue(PSeqQueue Q,DataType *x)
59 {
60  if(Q->front == Q->rear)
61  {
62   printf("队空\n");
63   return 0;
64  }
65  else
66  {
67   *x = Q->data[(Q->front + 1) % MAXSIZE];
68   return 1;
69  }
70 }
71 void Distroy_SeqQueue(PSeqQueue *Q)
72 {
73  if(*Q)
74   free(*Q);
75  *Q = NULL;
76 }

 

7.链式队列

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef int DataType;
 4 typedef struct node {
 5  DataType data;
 6  struct node *next;
 7 }QNode , * PQNode;
 8 typedef struct {
 9  PQNode front ,rear;
10 }LinkQueue, * PLinkQueue;
11 PLinkQueue Init_LinkQueue()
12 {
13  PLinkQueue Q;
14  Q = (PLinkQueue)malloc(sizeof(LinkQueue));
15  if(Q)
16  {
17   Q->front =NULL;
18   Q->rear = NULL;
19  }
20  return Q;
21 }
22 int Empty_LinkQueue(PLinkQueue Q)
23 {
24  if(Q && Q->front == NULL && Q->rear == NULL)
25   return 1;
26  else 
27   return 0;
28 }
29 int In_LinkQueue (PLinkQueue Q,DataType x)
30 {
31  PQNode P;
32  P = (PQNode)malloc(sizeof(QNode));
33  if(!P)
34  {
35   printf("内存分配失败");
36   return 0;
37  }
38  P->data = x;
39  P->next = NULL;
40  if(Empty_LinkQueue(Q))
41   Q->rear = Q->front = P;
42  else
43  {
44   Q->rear->next = P;
45   Q->rear = P;
46  }
47  return 1;
48 }
49 int Out_LinkQueue(PLinkQueue Q,DataType *x)
50 {
51  PQNode P;
52  if(Empty_LinkQueue(Q))
53  {
54   printf("队空");
55   return 0;
56  }
57  *x = Q->front->data;
58  P = Q->front;
59  Q->front = Q->front->next;
60  free(P);
61  if(!Q->front)
62   Q->rear = NULL;
63  return 1;
64 }
65 int Front_LinkQueue(PLinkQueue Q,DataType *x)
66 {
67  if(Empty_LinkQueue(Q))
68  {
69   printf("队空");
70   return 0;
71  }
72  *x = Q->front->data;
73  return 1;
74 }
75 void Distroy_LinkQueue(PLinkQueue *Q)
76 {
77  PQNode P;
78  if(*Q)
79  {
80   while((*Q)->front)
81   {
82    P =(*Q)->front;
83    (*Q)->front = (*Q)->front->next;
84    free(P);
85   }
86   free(*Q);
87  }
88  *Q = NULL;
89 }

 

8.字符串.1

  1 //Hstring.h头文件定义
  2 typedef struct
  3 {
  4  char *p_ch;
  5  int length;
  6 }Hstring;
  7 int strAssign(Hstring *s1, char *s2);
  8 int StrCopy(Hstring *s1, Hstring s2);
  9 int SubString(Hstring *sub, Hstring s, int pos, int len);
 10 int StrContact(Hsring *t, Hstring s1, Hstring s2);
 11 int StrInsert(Hstring *s, int pos, Hstring t);
 12 int Init_String(Hstring *s);
 13 Distory_String(Hstring *s);
 14 
 15 //串常量赋值
 16 int strAssign(Hstring *s1,char *s2)
 17 {
 18  int i;
 19  char *pc;
 20  if(s1->p_ch)
 21   free(s1->p_ch);
 22  for (i = 0, pc = s2; *pc != '\0'; i++, p++)
 23   ;
 24  if (i == 0)
 25  {
 26   s1->p_ch = 0;
 27   s1->length = 0;
 28   return 0;
 29  }
 30  if (!(s1->p_ch = (char *)malloc(i*sizeof(char))))
 31  {
 32   printf("堆空间不足,赋值失败!\n");
 33   return 0;
 34  }
 35  for (int j = 0; j < i; j++)
 36  {
 37   s1->p_ch[j] = s2[j];
 38  }
 39  s1->length = i;
 40  return 1;
 41 }
 42 /*将一个字符串的值赋值给一个字符串变量*/
 43 int StrCopy(Hstring *s1, Hstring s2)
 44 {
 45  if (s2.length <= 0)
 46   return 0;
 47  if (!(s1->p_ch = (char*)malloc(sizeof(char)*length)))
 48  {
 49   printf("堆空间不足,赋值失败!\n");
 50   return 0;
 51  }
 52  for (int i = 0; i < s2.length; i++)
 53   s1->p_ch[i] = s2.p_ch[i];
 54  s1->length = s2.length;
 55  return 1;
 56 }
 57 /*用sub返回串s的第pos 个字符起长度为len的字串;其中,1<=pos<=strLength(s)且0<=StrLength(s)-pos+1*/
 58 int SubString(Hstring *sub, Hstring s, int pos, int len)
 59 {
 60  int i;
 61  if (pos<1 || pos>s.length || len < 0 || s.length - pos + 1)
 62  {
 63   printf("pos参数不正确\n");
 64   return 0;
 65  }
 66  if (sub->p_ch)
 67   free(sub->p_ch);
 68  if (!len)
 69  {
 70   sub->p_ch = 0;
 71   sub->length = 0;
 72  }
 73  else
 74  {
 75   sub->p_ch = (char *)malloc(len * sizeof(char));
 76   for (i = 0; i < len; i++)
 77   {
 78    sub->p_ch[i] = s.p_ch[pos - 1 + i];
 79   }
 80   sub->length = len;
 81  }
 82 }
 83 //串链接
 84 int StrContact(Hsring *t, Hstring s1, Hstring s2)
 85 {
 86  if (t->p_ch)
 87   free(t->p_ch);
 88  if (!(t->p_ch = (char *)malloc(sizeof(char)*(s1.length + s2.length))));
 89  {
 90   printf("堆空间已满,串连接失败\n");
 91   return 0;
 92  }
 93  for (int i = 0; i < s1.length; i++)
 94   t->p_ch[i] = s1.p_ch[i];
 95  t->length = s1.length + s2.length;
 96  for (i = s1.length; i < t->length; i++)
 97  {
 98   t->p_ch[i] = s2.p_ch[i - s1.length];
 99  }
100  return 1;
101 }
102 int StrInsert(Hstring *s, int pos, Hstring t)
103 {
104  int i;
105  if (pos<1 || pos>s->lngth + 1)
106  {
107   printf("插入参数不正确,插入失败\n");
108   return 0;
109  }
110  if (t.length == 0)
111  {
112   printf("堆空间为0,插入失败\n");
113   return 0;
114  }
115  if (!s->p_ch = (char *)realloc(s->p_ch, (s->length + t.length)*sizeof(char))
116  {
117   printf("堆空间不足,插入失败\n");
118   return 0;
119  }
120  for (i = s->length - 1; i >= pos - 1; i--)
121   s->p_ch[i + t.length] = s->p_ch[i];
122  for (i = pos - 1; i <= pos + t.length - 2; i++)
123   s->length = s->length + length;
124  return 1;
125 }
126 //置空串
127 int Init_String(Hstring *s)
128 {
129  s->p_ch = 0;
130  s->length = 0;
131  return 1;
132 }
133 //销毁串
134 Distory_String(Hstring *s)
135 {
136  if (s->length)
137  {
138   free(s->p_ch);
139   s->p_ch = 0;
140   s->length = 0;
141  }
142  return 1;
143 }

 

9.字符串.2

 

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define MAXSIZE 256
  4 //本文件中包含的函数
  5 int StrLength(char *s);//获取字符串的长度并返回
  6 int StrConcat(char *s1, char *s2, char *s);//连接两个字符串
  7 int StrSub(char *t, char *s, int i, int len);//从s字符串中的第i个位置获取长度为len的字符串放到*t中并返回1
  8 int StrCmp(char *s1, char *s2);//比较两个字符串是否相等
  9 int StrIndex_BF(char *s, char *t);//获取字符串s中的与t相等的子串,并返回位置
 10 int Index_KMP(const char* S, const char* T); 
 11 //获取字符串的长度并返回
 12 int StrLength(char *s)
 13 {
 14  int i = 0;
 15  while (s[i] != '\0')
 16   i++;
 17  return i;
 18 }
 19 //连接两个字符串
 20 int StrConcat(char *s1, char *s2, char *s)
 21 {
 22  int i = 0, j, len1, len2;
 23  len1 = StrLength(s1);
 24  len2 = StrLength(s2);
 25  if (len1 + len2 > MAXSIZE - 1)
 26  {
 27   printf("长度溢出\n");
 28   return 0;
 29  }
 30  j = 0;
 31  while (s1[j] != '\0')
 32  {
 33   s[i] = s1[j];
 34   i++;
 35   j++;
 36  }
 37  j = 0;
 38  while (s2[j] != '\0')
 39  {
 40   s[i] = s2[j];
 41   i++;
 42   j++;
 43  }
 44  s[i] = '\0';
 45  return 1;
 46 }
 47 //从s字符串中的第i个位置获取长度为len的字符串放到*t中并返回1
 48 int StrSub(char *t, char *s, int i, int len)
 49 {
 50  int slen;
 51  int j;
 52  slen = StrLength(s);
 53  if (i<1 || i>slen || len<0 || len>slen - i + 1)
 54  {
 55   printf("参数不对");
 56   return 0;
 57  }
 58  for (j = 0; j < len; j++)
 59   t[j] = s[i + j - 1];
 60  t[j] = '\0';
 61  return 1;
 62 }
 63 //比较两个字符串是否相等
 64 int StrCmp(char *s1, char *s2)
 65 {
 66  int i = 0;
 67  while (s1[i] == s2[i] && s1[i] != '\0')
 68   i++;
 69  return (s1[i] == s2[i]);
 70  //如果两个字符串相等,则s1[i]=s2[i]='\0',返回为1
 71 }
 72 //获取字符串s中的与t相等的子串,并返回位置
 73 int StrIndex_BF(char *s, char *t)
 74 {
 75  //如果找到,则返回位置,未找到返回-1,表示不再串中,即查找失败
 76  int i = 0, j = 0;
 77  while (s[i] != '\0' && t[j] != '\0')
 78  {
 79   if (s[i] == t[j])
 80   {
 81    i++;
 82    j++;
 83   }
 84   else
 85   {
 86    i = i - j + 1;
 87    j = 0;
 88   }
 89  }
 90  if (j == StrLength(t))
 91   return i - j;
 92  else
 93   return -1;
 94 }
 95 void get_next(const char* T,int* next)
 96 {
 97     int i = 1, j = 0;
 98     next[1] = 0;
 99     while (i<StrLength(T))
100     {
101  if(j == 0 || T[i] == T[j])
102         {
103       ++i; 
104       ++j;
105       next[i] = j;
106         }
107         else  
108    j = next[j];
109     }
110 }
111  /*算法4.8*/
112 /*void get_nextval(const char* T, int* nextval)
113 {
114     int i=1,j=0;
115     nextval[1] = 0;
116     while (i<strlen(T))
117     {
118  if(j == 0 || T[i] == T[j])
119         {
120             ++i; 
121    ++j;
122             if (T[i]!=T[j])
123     nextval[i] = j;
124             else 
125     nextval[i] = nextval[j];
126         }
127         else   
128    j = nextval[j];
129     }
130 }
131 */
132  /*算法4.6*/
133 int Index_KMP(const char* S, const char* T) 
134 {
135    int* next=(int*)malloc(sizeof(int)*strlen(T));
136    int i=1, j=1, k=1;
137    get_next(T, next);
138    printf("the Value of Next is   :");
139    while (k < strlen(T))
140    {
141       printf("%3d",next[k]);
142       ++k;
143    }
144    printf("\n");
145    while (i < strlen(S) && j < strlen(T))
146    {
147       if (j == 0 || S[i] == T[j])
148       {
149   ++i;  
150   ++j;
151       }
152       else
153     j = next[j];
154    }
155   if (j >= strlen(T))
156    return  i-strlen(T);
157   else 
158    return 0;
159 }
160  
161  
162  

 

posted @ 2018-04-20 20:27  醉风晨  阅读(613)  评论(0编辑  收藏  举报