vs2019 常用数据结构 纯C语言 头文件实现 (持续更新改错中)单链表,

2021-06-11 10:05

阅读:663

标签:get   osi   top   数据结构   rev   nod   fir   line   语言   

1.单链表:

 1 #pragma once
 2 #ifndef _List_H
 3 #include 4 #include 5 #define ElementType int
 6 
 7 struct Node;
 8 typedef struct Node* PtrToNode;
 9 typedef PtrToNode List;
10 typedef PtrToNode Position;
11 
12 List MakeEmpty(List L);
13 int IsEmpty(List L);
14 int IsLast(Position P, List L);
15 Position Find(ElementType X, List L);
16 void Delete(ElementType X, List L);
17 Position FindPrevious(ElementType X, List L);
18 void Insert(ElementType X, List L, Position P);
19 void DeleteList(List L);
20 Position Header(List L);
21 Position First(List L);
22 Position Advance(Position P);
23 ElementType Rretrieve(Position P);
24 #endif // !_List_H
25 
26 struct Node
27 {
28     ElementType Element;
29     Position Next;
30 };
31 
32 inline List MakeEmpty(List L)
33 {
34     return List();
35 }
36 
37 int IsEmpty(List L)
38 {
39     return L->Next == NULL;
40 }
41 
42 int IsLast(Position P, List L)
43 {
44     return P->Next == NULL;
45 }
46 
47 Position Find(ElementType X, List L)
48 {
49     Position P;
50     P = L->Next;
51     while (P != NULL && P->Element != X) {
52         P = P->Next;
53     }
54     return P;
55 }
56 
57 void Delete(ElementType X, List L)
58 {
59     Position P, TmpCell = nullptr;
60     P = FindPrevious(X, L);
61     if (!IsLast(P, L)) {
62         TmpCell = P->Next;
63         P->Next = TmpCell->Next;
64         free(TmpCell);
65     }
66 }
67 
68 Position FindPrevious(ElementType X, List L)
69 {
70     Position P;
71     P = L;
72     while (P->Next != NULL && P->Next->Element != X) {
73         P = P->Next;
74     }
75     return P;
76 }
77 
78 void Insert(ElementType X, List L, Position P)
79 {
80     Position TmpCell;
81     TmpCell = (Node*)malloc(sizeof(struct Node));
82     if (TmpCell == NULL) {
83         printf("fatal error:out of space!\n");
84         exit(1);
85     }
86     TmpCell->Element = X;
87 }
88 
89 void DeleteList(List L)
90 {
91     L = NULL;
92     free(L);
93 }

2.顺序栈有头结点

 1 #pragma once
 2 #ifndef _sqStack_h
 3 #include 4 #include 5 #define StackSize 100
 6 typedef int ElementType;
 7 typedef struct {
 8     ElementType data[StackSize];
 9     int top;
10 }sqStack;
11 void InitStack(sqStack* s);
12 int IsEmpty(sqStack* s);
13 void PrintStack(sqStack* s);
14 int Push(sqStack* s, ElementType* val);
15 int Pop(sqStack* s, ElementType* val);
16 int GetTop(sqStack* s, ElementType* val);
17 int ClearStack(sqStack* s);
18 #endif // !_sqStack_h
19 void InitStack(sqStack* s)
20 {
21     s->top = -1;
22 }
23 
24 int IsEmpty(sqStack* s)
25 {
26     if (s->top == -1) {
27         return 1;
28     }
29     else return 0;
30 }
31 
32 void PrintStack(sqStack* s)
33 {
34     if (IsEmpty(s)) {
35         printf("Empty Stack!");
36     }
37     else {
38         for (int i = 0; i top) + 1; i++) {
39             printf("%d\t", s->data[i]);
40         }
41         printf("\n");
42     }
43 }
44 int Push(sqStack* s, ElementType* val)
45 {
46     if (s->top 1) {
47         s->top = s->top + 1;
48         s->data[s->top] = *val;
49         return 1;
50     }
51     else {
52         printf("full stack!");
53         exit(1);
54     }
55 }
56 
57 int Pop(sqStack* s, ElementType* val)
58 {
59     if (s->top == -1) {
60         printf("Empty Stack!");
61         exit(-1);
62     }
63     else {
64         *val = s->data[s->top];
65         s->top--;
66     }
67     return 1;
68 }
69 
70 int GetTop(sqStack* s, ElementType* val)
71 {
72     if (IsEmpty(s)) {
73         printf("Empty Stack!");
74         exit(-1);
75     }
76     else {
77         *val = s->data[s->top];
78     }
79 
80     return 1;
81 }
82 
83 int ClearStack(sqStack* s)
84 {
85     s->top = -1;
86     return 1;
87 }

3.链栈(无头结点)

 1 #pragma once
 2 #ifndef _LStack_H
 3 #include 4 #include 5 typedef int ElementType;
 6 typedef struct stnode {
 7     ElementType data;
 8     struct  stnode* next;
 9     size_t LenStack;
10 }Lstack;
11 
12 Lstack* LstackCreate();
13 void InitStack(Lstack* s);
14 int push(Lstack* s, ElementType val);
15 int pop(Lstack* s, ElementType* val);
16 int gettop(Lstack* s, ElementType* val);
17 int IsEmpty(Lstack* s);
18 void print(Lstack* s);
19 #endif // !_LStack_H
20 Lstack* LstackCreate()
21 {
22     Lstack* s = (Lstack*)malloc(sizeof(Lstack));
23     InitStack(s);
24     return s;
25 }
26 //带头结点的链栈
27 void InitStack(Lstack* s)
28 {
29     s->next = NULL;
30     s->LenStack = 0;
31 }
32 int push(Lstack* s, ElementType val)
33 {
34     Lstack* p;
35     p = LstackCreate();
36     p->data = val;
37     if (IsEmpty(s)) {
38         s = p;
39     }
40     else {
41         p->next = s;
42         s->next = p;
43     }
44     (s->LenStack)++;
45     return 1;
46 }
47 
48 int pop(Lstack* s, ElementType* val)
49 {
50     if (IsEmpty(s)) {
51         printf("Empty Stack!");
52         exit(1);
53     }
54     Lstack* tmp;
55     tmp = LstackCreate();
56     tmp = s->next;
57     *val = tmp->data;
58     s->next = tmp->next;
59     free(tmp);
60     return 1;
61 }
62 
63 int gettop(Lstack* s, ElementType* val)
64 {
65     if (IsEmpty(s)) {
66         printf("Empty Stack!");
67         exit(1);
68     }
69     *val = s->next->data;
70     return 1;
71 }
72 
73 int IsEmpty(Lstack* s)
74 {
75     if (s->LenStack == 0) {
76         return 1;
77     }
78     return 0;
79 }
80 
81 void print(Lstack* s)
82 {
83     ;//懒得写了,也挺简单的
84 }

4.链栈

 1 #pragma once
 2 #ifndef _LStack_H
 3 #include 4 #include 5 typedef int ElementType;
 6 typedef struct stnode {
 7     ElementType data;
 8     struct  stnode* next;
 9     size_t LenStack;
10 }Lstack;
11 
12 Lstack* LstackCreate();
13 void InitStack(Lstack* s);
14 int push(Lstack* s, ElementType val);
15 int pop(Lstack* s, ElementType* val);
16 int gettop(Lstack* s, ElementType* val);
17 int IsEmpty(Lstack* s);
18 void print(Lstack* s);
19 #endif // !_LStack_H
20 Lstack* LstackCreate()
21 {
22     Lstack* s = (Lstack*)malloc(sizeof(Lstack));
23     InitStack(s);
24     return s;
25 }
26 //带头结点的链栈
27 void InitStack(Lstack* s)
28 {
29     s->next = NULL;
30     s->LenStack = 0;
31 }
32 int push(Lstack* s, ElementType val)
33 {
34     Lstack* p;
35     p = LstackCreate();
36     p->data = val;
37     if (IsEmpty(s)) {
38         s->next = p;
39     }
40     else {
41         p->next = s->next;
42         s->next = p;
43     }
44     (s->LenStack)++;
45     return 1;
46 }
47 
48 int pop(Lstack* s, ElementType* val)
49 {
50     if (IsEmpty(s)) {
51         printf("Empty Stack!");
52         exit(1);
53     }
54     Lstack* tmp;
55     tmp = LstackCreate();
56     tmp = s->next;
57     *val = tmp->data;
58     s->next = tmp->next;
59     free(tmp);
60     return 1;
61 }
62 
63 int gettop(Lstack* s, ElementType* val)
64 {
65     if (IsEmpty(s)) {
66         printf("Empty Stack!");
67         exit(1);
68     }
69     *val = s->next->data;
70     return 1;
71 }
72 
73 int IsEmpty(Lstack* s)
74 {
75     if (s->LenStack == 0) {
76         return 1;
77     }
78     return 0;
79 }
80 
81 void print(Lstack* s)
82 {
83     ;
84 }

5.顺序队列

 1 #pragma once
 2 #ifndef _sqQueue_h
 3 #include 4 #include 5 #define MaxSize 20
 6 typedef int ElementType;
 7 typedef struct asqQueue {
 8     ElementType data[MaxSize];
 9     int front, rear;
10 }squeue;
11 
12 void Initqueue(squeue* q);
13 squeue* squeueCreate();
14 int IsEmpty(squeue q);
15 int EQueue(squeue* q, ElementType val);
16 int OQueue(squeue* q, ElementType* val);
17 int GetQhead(squeue* q, ElementType* val);
18 void ClearQueue(squeue* q);
19 
20 #endif // !_sqQueue_h
21 void Initqueue(squeue* q)
22 {
23     q->rear = 0;
24     q->front = 0;
25 }
26 squeue* squeueCreate()
27 {
28     squeue* q = (squeue*)malloc(sizeof(squeue));
29 
30     return q;
31 }
32 
33 int IsEmpty(squeue q)
34 {
35     if (q.rear == q.front) {
36         return 1;
37     }
38     return 0;
39 }
40 
41 inline int EQueue(squeue* q, ElementType val)
42 {
43     if (((q->rear) + 1) % MaxSize == q->front) {
44         printf("overflow queue!");
45         exit(1);
46     }
47     else {
48         q->rear = ((q->rear) + 1) % MaxSize;
49         q->data[q->rear] = val;
50     }
51 
52     return 1;
53 }
54 
55 inline int OQueue(squeue* q, ElementType* val)
56 {
57     if (q->front == q->rear) {
58         printf("Empty Queue!");
59         exit(1);
60     }
61     else {
62         q->front = ((q->front) + 1) % MaxSize;
63         *val = q->data[q->front];
64     }
65 
66     return 1;
67 }
68 
69 inline int GetQhead(squeue* q, ElementType* val)
70 {
71     if (q->front == q->rear) {
72         printf("Empty Queue!");
73         exit(1);
74     }
75     else {
76         *val = (q->data[q->front + 1]) % MaxSize;
77     }
78     return 1;
79 }
80 
81 inline void ClearQueue(squeue* q)
82 {
83     q->front = q->rear = 0;
84     printf("Clear Success!");
85 }

6.链式队列

  1 #pragma once
  2 #ifndef _LQueue_H
  3 #include  4 #include  5 typedef int QElementType;
  6 typedef int ElementType;
  7 typedef struct LQNode {
  8     QElementType data;
  9     struct LQNode* next;
 10 }LQNode, * QueuePtr;
 11 
 12 typedef struct {
 13     QueuePtr front;
 14     QueuePtr rear;
 15 }LQueue;
 16 
 17 void InitQueue(LQueue* LQ);
 18 void EQueue(LQueue* LQ, ElementType val);
 19 void OQueue(LQueue* LQ, ElementType* val);
 20 int IsEmpty(LQueue* LQ);
 21 int GetQhead(LQueue* LQ, ElementType* val);
 22 void ClearQueue(LQueue* LQ);
 23 
 24 #endif // !_LQueue_H
 25 void InitQueue(LQueue* LQ)
 26 {
 27     LQ->front = NULL;
 28     LQ->rear = NULL;
 29 }
 30 
 31 LQueue* LQueueCreate()
 32 {
 33     LQueue* LQ = (LQueue*)malloc(sizeof(LQueue));
 34     InitQueue(LQ);
 35     return LQ;
 36 }
 37 
 38 void EQueue(LQueue* LQ, ElementType val)
 39 {
 40     QueuePtr tmp;
 41     tmp = (QueuePtr)malloc(sizeof(LQNode));
 42     tmp->data = val;
 43     tmp->next = NULL;
 44     if (LQ->front == NULL && LQ->rear == NULL) {
 45         LQ->rear = tmp;
 46         LQ->front = tmp;
 47     }
 48     else {
 49         LQ->rear->next = tmp;
 50         LQ->rear = tmp;
 51     }
 52 }
 53 
 54 void OQueue(LQueue* LQ, ElementType* val)
 55 {
 56     QueuePtr tmp;
 57     if (IsEmpty(LQ)) {
 58         printf("Empty LinkQueue!");
 59         exit(1);
 60     }
 61     else {
 62         tmp = LQ->front;
 63         *val = LQ->front->data;
 64         if (LQ->front == LQ->rear) {
 65             LQ->front = NULL;
 66             LQ->rear = NULL;
 67         }
 68         else {
 69             LQ->front = LQ->front->next;
 70         }
 71     }
 72     free(tmp);
 73 }
 74 
 75 inline int IsEmpty(LQueue* LQ)
 76 {
 77     if (LQ->front == NULL && LQ->rear == NULL) {
 78         return 1;
 79     }
 80     return 0;
 81 }
 82 
 83 inline int GetQhead(LQueue* LQ, ElementType* val)
 84 {
 85     if (IsEmpty(LQ)) {
 86         printf("Empty LQueue!");
 87         exit(1);
 88     }
 89     else {
 90         *val = LQ->front->data;
 91     }
 92     return 0;
 93 }
 94 
 95 inline void ClearQueue(LQueue* LQ)
 96 {
 97     QueuePtr tmp1, tmp2;
 98     tmp1 = LQ->front;
 99     while (tmp1) {
100         tmp2 = tmp1;
101         free(tmp2);
102         tmp1 = tmp1->next;
103     }
104     LQ->front = NULL;
105     LQ->rear = NULL;
106 }

 

vs2019 常用数据结构 纯C语言 头文件实现 (持续更新改错中)单链表,

标签:get   osi   top   数据结构   rev   nod   fir   line   语言   

原文地址:https://www.cnblogs.com/Npc-Hb/p/14226441.html


评论


亲,登录后才可以留言!