資料結構與演算法(十)
阿新 • • 發佈:2019-01-14
連結串列的操作(遍歷、查詢、清空、銷燬、求長度、增加、刪除)
建立一個連結串列:需要三個指標(頭指標、始終指向尾節點的指標(剛開始讓其指向頭結點)、新創節點指標)
遍歷:需要一個指標P,剛開始指向首節點,用while(NULL!=P)來迴圈,在迴圈裡面更新指標P,P = P->pNext,讓其指向下一個節點。
演算法:
狹義的演算法是與資料的儲存有關
廣義的演算法與資料的儲存無關
泛型:通過某種技術(函式的過載)達到的效果就是:不同的儲存方式,使用的操作是一樣的
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct Node { int data;//資料域 struct Node *pNext;//指標域,指向的資料型別與本身結構體的資料型別一樣 }* P_N,N;//P_N<==>struct Node *,N<==>struct Node P_N list_creat() { int len; int i; int val; P_N pHead = (P_N) malloc(sizeof(N));//建立一個頭結點 if(pHead == NULL) { printf("記憶體建立失敗,終止程式\n"); exit(-1); } P_N pTail = pHead;//建立一個指標,始終指向尾節點 pTail->pNext = NULL; printf("請輸入有效節點的個數:len = "); scanf("%d",&len); for(i=0;i<len;i++) { printf("請為第%d個節點賦值:",(i+1)); scanf("%d",&val); P_N pNew = (P_N) malloc(sizeof(N));//建立一個節點 if(pNew == NULL) { printf("記憶體建立失敗,終止程式\n"); exit(-1); } pNew->data = val; pTail->pNext = pNew;//在尾節點掛上新節點 pTail = pNew;//使pTail始終指向尾節點 pTail->pNext = NULL; } return pHead; } void traverse_list(P_N pHead) { P_N p = pHead->pNext;//p指向首節點 while(NULL != p) { printf("%d ",p->data); p = p->pNext; } printf("\n"); return; } bool empty_list(P_N pHead) { P_N p = pHead->pNext; if(NULL == p) return true; else return false; } int length_list(P_N pHead) { P_N p = pHead->pNext; int i = 0; while(NULL != p) { i++; p = p->pNext; } return i; } void sort_list(P_N pHead) { int i,j,t; int len = length_list(pHead); P_N 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) { t = p->data; p->data = q->data; q->data = t; } } } bool insert_list(P_N pHead,int pos,int val)//在第pos個有效節點之前插入,從1開始,val要插入的值 { P_N p = pHead; int i=0; while(NULL != p->pNext && i<pos-1) { p = p->pNext; i++; } if(p->pNext == NULL || i > pos-1)//考慮了list空,pos值不合法(負數或超過) return false; P_N pNew = (P_N)malloc(sizeof(N)); pNew->data = val; P_N pTemp = (P_N)malloc(sizeof(N)); pTemp = p->pNext; p->pNext = pNew; pNew->pNext = pTemp; return true; } bool delete_list(P_N pHead,int pos,int * val) { P_N p = pHead; int i = 0; while(NULL!=p->pNext && i< pos -1) { p = p->pNext; i++; } if(i>pos-1 || NULL==p->pNext) return false; P_N q = p->pNext;//刪除p節點後面的一個節點 * val = q->data; p->pNext = q->pNext; free(q); return true; } int main(void) { int del_val; int len; P_N pHead = NULL;//建立一個頭指標 pHead = list_creat();//建立一個連結串列,使頭指標指向連結串列的頭結點 /*len = length_list(pHead); printf("len = %d\n",len); traverse_list(pHead); sort_list(pHead); traverse_list(pHead);*/ insert_list(pHead,3,5); traverse_list(pHead); delete_list(pHead,4,&del_val); traverse_list(pHead); return 0; }