//函數聲明部分:"CirLinkList.h" #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct linknode { ElemType data; struct linknode *next; }node; void judgement_NULL(node * p); //判斷動態內存是否開闢成功 node * creat_order(); //創建循環鏈表 void insert(node *head, int i, ElemType x); //在i位置上插入一個值爲x的結點 void delete(node *head, int i); //刪除i位置的結點 void find(node *head, ElemType x); //尋找只爲x的結點位置 void length_list(node *head); void output(node * head); //打印整個鏈表 void inits_linklist(node *head); //釋放整個鏈表 void sortrank(node *head); //對整個鏈表進行排序 //函數實現:"CirLinkList.c" #include"CirLinkList.h" void judgement_NULL(node * p) //判斷動態內存是否開闢成功,若是失敗,程序直接結束 { if (p == NULL) { perror("out of memory\n"); exit(EXIT_FAILURE); } } node * creat_order() //建立一個循環單鏈表 { printf("請建立循環鏈表:"); node *head, *p, *r; ElemType x; head = (node *)malloc(sizeof(node)); judgement_NULL(head); r = head; head->next = NULL; while (1) { scanf("%d", &x); if (x != 0) { p = (node *)malloc(sizeof(node)); judgement_NULL(p); p->data = x; r->next = p; r = p; } else break; } r->next = head; //讓最後一個結點的指針域指向頭結點 printf("建立成功\n"); return head; } void insert(node *head, int i, ElemType x) //在i位置上插入一個元素x { node *p, *r, *q; p = (node *)malloc(sizeof(node)); judgement_NULL(p); p->data = x; r = head; while (1) //由於是循環鏈表,因此輸入的位置只要i>1,就必定會有一個位置能夠插入 { if (i<=1) //順着鏈表循環,直到i--到1 break; r = r->next; i--; } if (i < 1) printf("沒有這個結點\n"); else { q = r->next; //從頭結點以後開始插入 r->next = p; p->next = q; printf("插入成功\n"); } } void delete(node *head, int i) //刪除鏈表中i位置的結點 { node *p, *q; p = head; while (1) //循環整個鏈表,直到i--到1 { if (i <= 1) break; p = p->next; i--; } if (i<1) printf("沒有該結點\n"); else { if (p->next== head) //若是找到要刪除的結點是頭結點,則跳過刪除下一個結點 { p = head->next; head->next = p->next; free(p); } else { q = p->next; p->next = q->next; free(q); q = NULL; } printf("刪除成功\n"); } } void find(node *head, ElemType x) //查找值爲x的元素所在結點位置 { head = head->next; node *p; int count = 1; if (head->data == x) printf("結點位置:1"); else { p = head->next; while (p != head) { count++; if (p->data == x) break; else p = p->next; } if (p == head) printf("沒有這個結點\n"); else printf("結點位置:%d\n", count); } } void length_list(node *head) //求取循環鏈表的結點個數 { int len = 0; if (head->next == NULL) { printf("鏈表爲NULL\n"); } else { node *p = head->next; while (p != head) { len++; p = p->next; } printf("鏈表長度:%d\n", len); } } void output(node * head) //打印循環鏈表 { node *p; if (head == NULL) printf("鏈表爲空\n"); else { printf("打印鏈表:"); p = head->next; while (p != head) { printf("%d ", p->data); p = p->next; } printf("\n"); } } void inits_linklist(node *head) //初始化鏈表 { node *p,*r; p = head->next; while (p !=head) { r = p; p = p->next; free(r); r = NULL; } free(head); head = NULL; printf("初始化成功\n"); } void sortrank(node *head) //對整個鏈表進行排序 { node *p, *r; ElemType tmp; p = head->next; while (p->next != head) { r = head->next; while (r->next != head) { if ((r->data) >(r->next->data)) { tmp = r->data; r->data = r->next->data; r->next->data = tmp; } r = r->next; } p = p->next; } printf("排序成功\n"); } //函數測試部分: #include"CirLinkList.h" int main() { printf("*****************************************\n"); printf("*****************************************\n"); printf("**1.Creat_LinkList 2.Insert_Element **\n"); printf("**3.Find 4.Delete_Element **\n"); printf("**5.Length_LinkList 6.Output_LinkList**\n"); printf("*7.InitsLinkLinst 8.Sortrank **\n"); printf("*0.Exit *******************\n\n\n"); node *ret = NULL; ElemType x; int i = 0; int n = 0; while (1) //循環起來,直到選擇0結束 { printf("請選擇功能:"); scanf("%d", &n); if (n == 0) //當選擇功能時,選擇0的優先級最高,無條件退出 { free(ret); exit(1); } if (n == 1 && ret == NULL) //只有當前沒建立鏈表,並且ret爲空時,n==1時,建立鏈表纔有效 { ret = creat_order(); } else if (n != 1 && ret == NULL) printf("\n鏈表爲NULL,請創建鏈表\n\n"); else if (ret != NULL) //當建立鏈表以後這些語句纔有效 { switch (n) { case 2: //鏈表的末尾也能夠插入元素 printf("請輸入要插入的位置和要插入的元素\n"); scanf("%d", &i); scanf("%d", &x); insert(ret,i,x); break; case 3: printf("請輸入要查找的元素:"); scanf("%d", &x); find(ret,x); break; case 4: printf("請輸入要刪除的位置:"); scanf("%d", &i); delete(ret, i); break; case 5: length_list(ret); break; case 6: //打印鏈表 output(ret); break; case 7: inits_linklist(ret); ret = NULL; break; case 8: sortrank(ret); break; default: printf("選擇無效,請從新選擇\n"); break; } //switch()語句結束 } } system("pause"); return 0; }