連結串列、鏈式棧、鏈式佇列、二叉樹的C簡要實現
阿新 • • 發佈:2018-12-26
/*單鏈表簡要實現 * * */ #include <stdio.h> #include <stdlib.h> struct Node; typedef struct Node* PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; typedef int ElementType; struct Node{ ElementType data; Position Next; }; /*整表建立(頭插法)*/ List CreateList_Pre(); /*整表建立(尾插法)*/ List CreateList_Bac(); /*整表刪除*/ void DeleteList(List L); /*得到當前連結串列的長度*/ int ListLength(List L); /*得到指定位置的元素*/ int getElement(List L, ElementType i); /*插入指定值到指定位置前面*/ void Insert_Pre(List L, ElementType element, int i); /*插入指定值到指定位置後面*/ void Insert_Bac(List L, ElementType element, int i); /*刪除指定位置的元素*/ void Delete(List L, ElementType i); /*遍歷連結串列*/ void ListTraverse(List L); List CreateList_Pre(){ Position NewNode; List L = malloc(sizeof(struct Node)); if (L == NULL) return; L->Next = NULL; for (int i = 1; i <= 10; i++){ NewNode = malloc(sizeof(struct Node)); NewNode->data = i; NewNode->Next = L->Next; L->Next = NewNode; } return L; } List CreateList_Bac(){ Position NewNode; Position FirstNode; List L = malloc(sizeof(struct Node)); FirstNode = L; if (L == NULL) return; for (int i = 1; i <= 10; i++){ NewNode = malloc(sizeof(struct Node)); NewNode->data = i; L->Next = NewNode; L = NewNode; } L->Next = NULL; return FirstNode; } void DeleteList(List L){ Position P, Q; P = L->Next; while (P != NULL){ Q = P->Next; free(P); P = Q; } L->Next = NULL; } int ListLength(List L){ Position P; int count = 0; P = L->Next; while (P != NULL){ P = P->Next; count++; } return count; } int getElement(List L, ElementType i){ Position P; int count = 1; P = L->Next; if (P == NULL && i < count) return; while (P != NULL && i > count){ P = P->Next; count++; } return P->data; } void Insert_Pre(List L, ElementType element, int i){ Position P, NewNode; int count = 1; P = L; while (P->Next != NULL && count < i){ P = P->Next; count++; } if (P == NULL || i < count) return; NewNode = malloc(sizeof(struct Node)); NewNode->data = element; NewNode->Next = P->Next; P->Next = NewNode; } void Insert_Bac(List L, ElementType element, int i){ Position P, NewNode; int count = 1; P = L->Next; while (P != NULL && count < i){ P = P->Next; count++; } if (P == NULL || i < count) return; NewNode = malloc(sizeof(struct Node)); NewNode->data = element; NewNode->Next = P->Next; P->Next = NewNode; } void Delete(List L, ElementType i){ Position P, Tmp; int count = 1; P = L; while (P->Next != NULL && i > count){ P = P->Next; count++; } if (P->Next == NULL || i < count) return; Tmp = P->Next; P->Next = Tmp->Next; free(Tmp); } void ListTraverse(List L){ Position P; P = L->Next; while (P != NULL){ printf("%d ", P->data); P = P->Next; } printf("\n"); } void main(){ List L; L = CreateList_Bac(); printf("新建連結串列(尾插法): "); ListTraverse(L); printf("當前連結串列長度為: %d\n", ListLength(L)); printf("當前連結串列第7個元素為: %d\n", getElement(L, 7)); Insert_Pre(L, 16, 5); printf("插入至指定元素前面: "); ListTraverse(L); Insert_Bac(L, 16, 5); printf("插入至指定元素後面: "); ListTraverse(L); Delete(L, 5); printf("刪除指定元素: "); ListTraverse(L); DeleteList(L); printf("刪除連結串列: "); ListTraverse(L); printf("當前連結串列長度為: %d\n", ListLength(L)); printf("\n"); L = CreateList_Pre(); printf("新建連結串列(頭插法): "); ListTraverse(L); printf("當前連結串列長度為: %d\n", ListLength(L)); printf("當前連結串列第7個元素為: %d\n", getElement(L, 7)); Insert_Pre(L, 16, 5); printf("插入至指定元素前面: "); ListTraverse(L); Insert_Bac(L, 16, 5); printf("插入至指定元素後面: "); ListTraverse(L); Delete(L, 5); printf("刪除指定元素: "); ListTraverse(L); DeleteList(L); printf("刪除連結串列: "); ListTraverse(L); printf("當前連結串列長度為: %d\n", ListLength(L)); }
/*鏈式棧的簡要實現 * * */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 struct StackNode; struct LinkStack; typedef struct StackNode* PtrToStack; typedef struct LinkStack* PtrToLink; typedef PtrToStack Node; typedef PtrToStack LinkStackPtr; typedef PtrToLink Link; typedef int ElementType; struct StackNode{ int data; Node Next; }; struct LinkStack{ LinkStackPtr top; int count; }; Link InitStack();/*初始化鏈棧*/ void ClearStack(Link L);/*清空鏈棧*/ void StackEmpty(Link L);/*檢查鏈棧是否為空*/ int StackLength(Link L);/*檢查鏈棧長度*/ int GetTop(Link L);/*得到棧頂元素*/ int Push(Link L, ElementType e);/*壓棧操作*/ int Pop(Link L);/*彈棧操作*/ void LinkTraverse(Link L);/*遍歷鏈棧*/ /*初始化鏈棧*/ Link InitStack(){ Link L = malloc(sizeof(struct LinkStack)); if (L == NULL) return; L->top = malloc(sizeof(struct StackNode)); if (L->top == NULL) return; L->top = NULL; L->count = 0; return L; } /*清空鏈棧*/ void ClearStack(Link L){ LinkStackPtr P, Q; P = L->top; while (P != NULL){ Q = P->Next; free(P); P = Q; } L->count = 0; } /*檢查鏈棧是否為空*/ void StackEmpty(Link L){ if (L->count == 0) printf("鏈棧為空\n"); else printf("鏈棧不為空\n"); } /*檢查鏈棧長度*/ int StackLength(Link L){ return L->count; } /*得到棧頂元素*/ int GetTop(Link L){ if (L->top == NULL) return NULL; if (L->top == NULL) return; return L->top->data; } /*壓棧操作*/ int Push(Link L, ElementType e){ LinkStackPtr S = malloc(sizeof(struct StackNode)); S->data = e; S->Next = L->top; L->top = S; L->count++; return e; } /*彈棧操作*/ int Pop(Link L){ LinkStackPtr P; int e = L->top->data; P = L->top; L->top = P->Next; free(P); L->count--; return e; } /*遍歷鏈棧*/ void LinkTraverse(Link L){ LinkStackPtr P; P = L->top; while (P != NULL){ printf("%d\n", P->data); P = P->Next; } } void main(){ Link L; L = InitStack(); printf("壓棧(由底至頂):\n"); for (int i = 1; i <= 10; i++){ Push(L, i); } LinkTraverse(L); StackEmpty(L); printf("鏈棧長度為: %d\n",StackLength(L)); printf("鏈棧頂的元素為: %d\n", GetTop(L)); printf("\n"); printf("出棧(由頂至底):\n"); for (int i = 10; i > 0; i--){ printf("%d\n", Pop(L)); } LinkTraverse(L); StackEmpty(L); printf("鏈棧長度為: %d\n", StackLength(L)); printf("鏈棧頂的元素為: %d\n", GetTop(L)); }
/*鏈式佇列的簡要實現 * * */ #include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 struct Node; struct LinkQueue; typedef struct Node* PtrToNode; typedef struct LinkQueue* PtrToQueue; typedef PtrToNode QNode; typedef PtrToNode QueuePtr; typedef PtrToQueue Queue; typedef int ElementType; struct Node{ ElementType data; QNode Next; }; struct LinkQueue{ QueuePtr front; QueuePtr rear; }; Queue InitQueue();/*初始化佇列*/ void DestroyQueue(Queue Q);/*銷燬一個佇列*/ void ClearQueue(Queue Q);/*清空佇列*/ void QueueEmpty(Queue Q);/*檢查佇列是否為空*/ int QueueLength(Queue Q);/*獲取佇列長度*/ int GetHead(Queue Q);/*得到佇列頭元素*/ int EnQueue(Queue Q, ElementType e);/*入列*/ int DeQueue(Queue Q);/*出列*/ void QueueTraverse(Queue Q);/*遍歷佇列*/ /*初始化佇列*/ Queue InitQueue(){ Queue Q = malloc(sizeof(struct LinkQueue)); if (Q == NULL) return NULL; Q->front = Q->rear = malloc(sizeof(struct Node)); Q->front->Next = NULL; return Q; } /*銷燬一個佇列*/ void DestroyQueue(Queue Q){ while (Q->front != NULL){ Q->rear = Q->front->Next; free(Q->front); Q->front = Q->rear; } } /*清空佇列*/ void ClearQueue(Queue Q){ QueuePtr P, K; Q->rear = Q->front; P = Q->front->Next; Q->front->Next = NULL; while (P != NULL){ K = P->Next; free(P); P = K; } } /*檢查佇列是否為空*/ void QueueEmpty(Queue Q){ if (Q->front == Q->rear) printf("\n佇列為空\n"); else printf("\n佇列不為空\n"); } /*獲取佇列長度*/ int QueueLength(Queue Q){ QueuePtr P; int count = 0; P = Q->front; while (Q->rear != P){ P = P->Next; count++; } return count; } /*得到佇列頭元素*/ int GetHead(Queue Q){ QueuePtr P; if (Q->front == Q->rear) return NULL; P = Q->front->Next; return P->data; } /*入列*/ int EnQueue(Queue Q, ElementType e){ QueuePtr S = malloc(sizeof(struct Node)); if (S == NULL) return NULL; S->data = e; S->Next = NULL; Q->rear->Next = S; Q->rear = S; return e; } /*出列*/ int DeQueue(Queue Q){ QueuePtr P; if (Q->front == Q->rear) return NULL; P = Q->front->Next; ElementType e = P->data; Q->front->Next = P->Next; if (Q->rear == P) /*如果隊頭就是隊尾*/ Q->front = Q->rear; free(P); return e; } /*遍歷佇列*/ void QueueTraverse(Queue Q){ QueuePtr P; P = Q->front->Next; while (P != NULL){ printf("%d ", P->data); P = P->Next; } } void main(){ Queue Q; Q = InitQueue(); printf("入列:\n"); for (int i = 1; i <= 10; i++){ EnQueue(Q, i); } QueueTraverse(Q); QueueEmpty(Q); printf("佇列長度為: %d\n", QueueLength(Q)); printf("佇列頭元素為: %d\n", GetHead(Q)); printf("\n"); printf("出列:\n"); for (int i = 1; i <= 5; i++){ DeQueue(Q, i); } QueueTraverse(Q); QueueEmpty(Q); printf("佇列長度為: %d\n", QueueLength(Q)); printf("佇列頭元素為: %d\n", GetHead(Q)); ClearQueue(Q); printf("清空佇列後,佇列長度為: %d\n", QueueLength(Q)); }
/*二叉樹的鏈式結構實現
*
*
*/
#include <stdio.h>
#include <stdlib.h>
struct TreeNode;
typedef int ElementType;
typedef char TElementType;
typedef char* String;
typedef struct TreeNode* PtrToNode;
typedef PtrToNode Tree;
String str = "ABDH#K###E##CFI###G#J##";/*前序遍歷序列*/
ElementType index = 0;
struct TreeNode{
TElementType data;
Tree LChild;
Tree RChild;
};
Tree CreateBiTree();/*前序遍歷法建立一棵二叉樹*/
void Disptree(Tree T);/*凹入表示法輸出二叉樹* /
void PreOrderTraverse(Tree T);/*前序遍歷二叉樹*/
void InOrderTraverse(Tree T);/*中序遍歷二叉樹*/
void PostOrderTraverse(Tree T);/*後序遍歷二叉樹*/
void TreeEmpty(Tree T);/*檢查二叉樹是否為空*/
void ClearTree(Tree T);/*清空一顆二叉樹*/
int TreeDepth(Tree T);/*返回樹的深度*/
TElementType Root(Tree T);/*返回根節點*/
/*前序遍歷法建立一顆二叉樹*/
Tree CreateBiTree(){
char ch = str[index++];
Tree T;
if (ch == '#')
T = NULL;
else{
T = malloc(sizeof(struct TreeNode));
T->data = ch;
T->LChild = CreateBiTree();
T->RChild = CreateBiTree();
}
return T;
}
/*前序遍歷二叉樹*/
void PreOrderTraverse(Tree T){
if (T != NULL){
printf("%c ", T->data);
PreOrderTraverse(T->LChild);
PreOrderTraverse(T->RChild);
}
}
/*中序遍歷二叉樹*/
void InOrderTraverse(Tree T){
if (T != NULL){
InOrderTraverse(T->LChild);
printf("%c ", T->data);
InOrderTraverse(T->RChild);
}
}
/*後序遍歷二叉樹*/
void PostOrderTraverse(Tree T){
if (T != NULL){
PostOrderTraverse(T->LChild);
PostOrderTraverse(T->RChild);
printf("%c ", T->data);
}
}
/*檢查二叉樹是否為空*/
void TreeEmpty(Tree T){
if (T == NULL)
printf("二叉樹為空");
else
printf("二叉樹不為空");
}
//凹入表示法輸出二叉樹
void Disptree(Tree T)
{
if (T)
{
printf("%c", T->data);
if (T->LChild || T->RChild)
{
printf("(");
Disptree(T->LChild);
if (T->RChild)
printf(",");
Disptree(T->RChild);
printf(")");
}
}
}
/*清空一顆二叉樹*/
void ClearTree(Tree T){
if (T != NULL){
ClearTree(T->LChild);
ClearTree(T->RChild);
free(T);
}
return NULL;
}
/*返回樹的深度*/
int TreeDepth(Tree T){
int left, right;
if (T == NULL)
return NULL;
if (T->LChild != NULL)
left = TreeDepth(T->LChild);
else
left = 0;
if (T->RChild != NULL)
right = TreeDepth(T->RChild);
else
right = 0;
return left > right ? left + 1 : right + 1;
}
/*返回根節點*/
TElementType Root(Tree T){
if (T != NULL)
return T->data;
}
void main(){
Tree T;
T = CreateBiTree();
printf("凹入表示法:\n");
Disptree(T);
printf("\n前序遍歷:\n");
PreOrderTraverse(T);
printf("\n中序遍歷:\n");
InOrderTraverse(T);
printf("\n後序遍歷:\n");
PostOrderTraverse(T);
printf("\n樹是否為空:");
TreeEmpty(T);
printf("\n樹的深度為:%d", TreeDepth(T));
printf("\n樹的根節點為:%c", Root(T));
}