1. 程式人生 > >C語言,鏈表操作

C語言,鏈表操作

char next count 鏈表 刪除節點 free etc turn getchar()

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
    int _id;

    char s[50];
    struct Node* pre;
    struct Node* next;
};
void node_free(struct Node** q) {
    if( *q != NULL) {
        printf("free %d\n",(*q)->_id);
        
free(*q); *q = NULL; } } void node_print(struct Node* q) { if (NULL == q) { puts("節點打印:空節點,無可打印"); return; } printf("---id = %2d---", q->_id); printf("preview = %10d ", q->pre); printf("【address = %10d】 ", q); printf("next = %10d\n", q->next); }
void chain_print(struct Node* qFirst) { if (qFirst == NULL) { puts("沒有元素可以打印"); return; } puts("----------↓↓↓打印鏈表------------"); // 遍歷鏈表 struct Node* q; for(q = qFirst; q != NULL; q=q->next ) { node_print(q); } puts("
----------↑↑↑打印鏈表------------"); } /* * 為鏈表追加節點(加在最後) * 參數:頭節點,需要追加的節點 * 返回值:無 */ void chain_add(struct Node* qFirst, struct Node* qAdd) { // 定位到鏈表頭 struct Node* q = qFirst; // 只要後面(next)有節點,往後找;直到沒有next的節點(最後一個) for(q; q->next != NULL; q=q->next ) { node_print(q); } // 此時定位在最後一個節點,下圖1 // 將新節點加在最後節點的後面(next) q->next = qAdd;// 下圖2 qAdd->pre = q;//下圖3 } /* * 刪除節點 * 參數:1.頭結點 2.待刪除的結點 * 因為被刪除的結點需要置空,所以需要使用二級指針 * 返回值:-1 刪除失敗/0 刪除成功 */ int chain_remove(struct Node** qFirst, struct Node** qRemove) { struct Node* qPre = NULL; struct Node* qNext = NULL; struct Node* q = *qFirst; // 1.輸入Check if(NULL == *qRemove){ puts("刪無可刪!"); return -1; }else{ printf("刪除節點:id=%d\n", (*qRemove)->_id); } // 2.刪除頭結點,特殊對待 if(*qFirst == *qRemove ) { if((*qFirst)->next == NULL){ // 就一個頭結點的場合 node_free(qFirst); }else{ qNext = q->next; node_free(qFirst); *qFirst = qNext; } return 0; } // 遍歷鏈表 for(q; q != NULL; q=q->next ) { if (q == *qRemove) { qPre = q->pre; qNext = q->next; if (qNext!=NULL) { qNext->pre = qPre; qPre->next= qNext; } else { // 尾節點的場合 qPre->next= NULL; } node_free(qRemove); return 0; } } } void chain_clear(struct Node** qFirst) { puts("\n----------Clear------------"); if (qFirst == NULL) { puts("已經是空"); return; } // 遍歷鏈表 // 不斷刪除第一個元素 while(*qFirst != NULL) { chain_remove(qFirst,qFirst); } } struct Node* chain_get(struct Node* qFirst, int index) { printf("---獲取index = %d的節點:", index); int i = 0; // 遍歷鏈表 struct Node* q = qFirst; for(q; q!= NULL; q=q->next,i++ ) { if (index == i) { return q; } } return NULL; } /* * 獲取鏈表長度(即 節點的個數) * 參數: 頭節點 * 返回值:鏈表長度 */ int chain_count(struct Node* qFirst) { if (qFirst == NULL) { // 頭節點都沒有,長度為0 return 0; } int i = 0; // 遍歷鏈表 struct Node* q = qFirst; for(q; q != NULL; q=q->next) { // 順藤摸瓜,直到最後一個節點 i++;// 找到一個就+1 } return i; } struct Node* node_new(int id) { struct Node* q = (struct Node*)malloc(sizeof(struct Node)); memset(q, 0, sizeof(struct Node)); q->_id = id; return q; } void testFunction(){ struct Node* q1 = node_new(1); struct Node* q2 = node_new(2); struct Node* q3 = node_new(3); struct Node* q4 = node_new(4); struct Node* q5 = node_new(5); puts("###有節點的鏈表:"); printf("count = %d\n",chain_count(NULL)); chain_print(NULL); puts("\n###1個節點的鏈表:"); printf("count = %d\n",chain_count(q1)); chain_print(q1); // chain_add(q1, q2); chain_add(q1, q3); chain_add(q1, q4); chain_add(q1, q5); puts("\n###5個節點的鏈表:"); printf("count = %d\n",chain_count(q1)); chain_print(q1); puts(""); struct Node* pGet; pGet = chain_get(q1, 0); node_print(pGet); pGet = chain_get(q1, 1); node_print(pGet); pGet = chain_get(q1, 4); node_print(pGet); pGet = chain_get(q1, 5); node_print(pGet); // puts("\n###刪除測試"); chain_remove(&q1,&q5); chain_print(q1); chain_remove(&q1,&q3); chain_print(q1); chain_remove(&q1,&q1); chain_print(q1); //chain_remove(&q1,&q1); //chain_print(q1); //chain_remove(&q1,&q1); //chain_print(q1); //chain_remove(&q1,&q1); //chain_print(q1); chain_clear(&q1); chain_print(q1); getchar(); } int _tmain(int argc, _TCHAR* argv[]){ testFunction(); return 0; }

C語言,鏈表操作