對線性結構------單鏈表的各種操作
# include <stdio.h> # include <malloc.h> # include <stdlib.h> typedef struct Node { int data; //數據域 struct Node * pNext; //指針域 }NODE, *PNODE; //NODE等價於struct Node PNODE等價於struct Node * //函數聲明 PNODE create_list(void); //創建鏈表 void traverse_list(PNODE pHead); //遍歷鏈表 bool is_empty(PNODE pHead); //判斷鏈表是否爲空 int length_list(PNODE pHead); //求鏈表長度 bool insert_list(PNODE pHead, int pos, int val); //在pHead所指向鏈表的第pos個節點的前面插入一個新的結點,該節點的值是val, 並且pos的值是從1開始 bool delete_list(PNODE pHead, int pos, int * pVal); //刪除鏈表第pos個節點,並將刪除的結點的值存入pVal所指向的變量中, 並且pos的值是從1開始 void sort_list(PNODE pHead); //對鏈表進行排序 void append_list(PNODE pHead,int val); //在鏈表尾部追加元素 bool replase_list(PNODE pHead,int pos,int val); //將鏈表中某個位置的值替換成指定值 int main(void) { PNODE pHead = NULL; //等價於 struct Node * pHead = NULL; int val; pHead = create_list(); //create_list()功能:創建一個非循環單鏈表,並將該鏈表的頭結點的地址付給pHead traverse_list(pHead); printf("在鏈表的第2個位置插入33\n"); insert_list(pHead, 2, 33); traverse_list(pHead); printf("刪除鏈表第4個位置的值\n"); if ( delete_list(pHead, 4, &val) ) { printf("刪除成功,您刪除的元素是: %d\n", val); } else { printf("刪除失敗!您刪除的元素不存在!\n"); } traverse_list(pHead); printf("給鏈表排序\n"); sort_list(pHead); traverse_list(pHead); printf("在鏈表的末尾追加元素100\n"); append_list(pHead,100); traverse_list(pHead); printf("將鏈表第2個位置的元素替換成666\n"); replase_list(pHead,2,666); traverse_list(pHead); printf("輸出此時鏈表的長度\n"); int len = length_list(pHead); printf("鏈表的長度是%d\n", len); return 0; } PNODE create_list(void) { int len; //用來存放有效節點的個數 int i; int val; //用來臨時存放用戶輸入的結點的值 //分配了一個不存放有效數據的頭結點 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if (NULL == pHead) { printf("分配失敗, 程序終止!\n"); exit(-1); } PNODE pTail = pHead; pTail->pNext = NULL; printf("請輸入您需要生成的鏈表節點的個數: len = "); scanf("%d", &len); for (i=0; i<len; ++i) { printf("請輸入第%d個節點的值: ", i+1); scanf("%d", &val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("分配失敗, 程序終止!\n"); exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void traverse_list(PNODE pHead) { PNODE p = pHead->pNext; while (NULL != p) { printf("%d ", p->data); p = p->pNext; } printf("\n"); return; } bool is_empty(PNODE pHead) { if (NULL == pHead->pNext) return true; else return false; } int length_list(PNODE pHead) { PNODE p = pHead->pNext; int len = 0; while (NULL != p) { ++len; p = p->pNext; } return len; } void sort_list(PNODE pHead) { int i, j, t; int len = length_list(pHead); PNODE p, q; for (i=0,p=pHead->pNext; i<len-1; ++i,p=p->pNext) { for (j=i+1,q=p->pNext; j<len; ++j,q=q->pNext) { if (p->data > q->data) //類似於數組中的: a[i] > a[j] { t = p->data;//類似於數組中的: t = a[i]; p->data = q->data; //類似於數組中的: a[i] = a[j]; q->data = t; //類似於數組中的: a[j] = t; } } } return; } //在pHead所指向鏈表的第pos個節點的前面插入一個新的結點,該節點的值是val, 並且pos的值是從1開始 bool insert_list(PNODE pHead, int pos, int val) { int i = 0; PNODE p = pHead; while (NULL!=p && i<pos-1) { p = p->pNext; ++i; } if (i>pos-1 || NULL==p) return false; //如果程序能執行到這一行說明p已經指向了第pos-1個結點,但第pos-1個節點是否存在無所謂 //分配新的結點 PNODE pNew = (PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("動態分配內存失敗!\n"); exit(-1); } pNew->data = val; //將新的結點存入p節點的後面 PNODE q = p->pNext; p->pNext = pNew; pNew->pNext = q; return true; } bool delete_list(PNODE pHead, int pos, int * pVal) { int i = 0; PNODE p = pHead; while (NULL!=p->pNext && i<pos-1) { p = p->pNext; ++i; } if (i>pos-1 || NULL==p->pNext) return false; //如果程序能執行到這一行說明p已經指向了第pos-1個結點,並且第pos個節點是存在的 PNODE q = p->pNext; //q指向待刪除的結點 *pVal = q->data; //刪除p節點後面的結點 p->pNext = p->pNext->pNext; //釋放q所指向的節點所佔的內存 free(q); q = NULL; return true; } void append_list(PNODE pHead,int val) { PNODE p=pHead; while(NULL!=p->pNext) { p=p->pNext; } PNODE pNew=(PNODE)malloc(sizeof(NODE)); if (NULL == pNew) { printf("動態分配內存失敗!\n"); exit(-1); } pNew->data=val; p->pNext=pNew; pNew->pNext=NULL; } bool replase_list(PNODE pHead,int pos,int val) { int i=0; PNODE p=pHead; while(p->pNext!=NULL&&i<pos) { p=p->pNext; i++; } if(i>pos||NULL==p->pNext) return false; p->data=val; return true; }