C和指針 第十二章 使用結構和指針

鏈表是一種經常使用的數據結構,每一個節點經過鏈或者指針連接在一塊兒,程序經過間接指針訪問鏈表中的節點。數據結構

typedef struct Node  {
    //指向下一個節點的指針
     struct Node *next;
     int value;    
}

單鏈表只能夠單向遍歷優化

單鏈表中插入:初版指針

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

typedef struct Node {
	struct Node *next;
	int value;
} LinkList;

//假設鏈表從小到大排序
int linkInsert(LinkList * current, int value)
{
	//保存前一個節點
	LinkList *previous;
	LinkList *new;

	//循環到合適的位置
	while (current-> value < value) {
		previous = current;
		current = current->next;
	}

	new = malloc(sizeof(LinkList));
	if (new == NULL) {
		return FALSE;
	}

	new->value = value;
	new->next = current;
	previous->next = new;

	return TRUE;
}

當插入值到表頭和表尾時,會出錯,須要加上對特殊狀況的判斷,將傳入的第一個參數由,指向鏈表頭部節點的指針改成,指向 指向鏈表頭部的指針的指針,這樣就能夠添加節點到鏈表的頭部。blog

添加特殊狀況處理的版本二:排序

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

typedef struct Node {
    struct Node *next;
    int value;
} LinkList;

//
int linkInsert(LinkList **rootPtr, int value)
{
    //保存前一個節點
    LinkList *previous;
    LinkList *current;
    LinkList *new;

    current = *rootPtr;
    previous = NULL;

    //循環到達末尾和找到符合要求的節點
    while (current != NULL && current-> value < value) {
        previous = current;
        current = current->next;
    }

    new = malloc(sizeof(LinkList));
    if (new == NULL) {
        return FALSE;
    }

    new->value = value;
    new->next = current;

    //指向列表首頁
    if(previous == NULL){
        *rootPtr = new;
    }else{
        previous -> next = new;
    }

    return TRUE;
}

int main()
{
    LinkList third = {NULL, 4};
    LinkList second = {&third, 2};
    LinkList first = {&second, 1};
    LinkList *head = &first;
    LinkList **rootPtr = &head;

    linkInsert(rootPtr, 0);

    LinkList *pre = NULL;
    LinkList *current = *rootPtr;
    while(current != NULL){
        printf("%d\t", current -> value);
        pre = current;
        current = current -> next;
    }

    return 0;
}

優化:io

版本二把一個節點插入到鏈表的起始位置當作一種特殊狀況處理,對於新節點須要修改的是根節點,對於其餘任何點,修改的是前一個節點的next字段,其實這個兩個修改是相同的,即修改指向當前節點的指針,因此當咱們移動到下一個節點時,須要保存的是指向下一個節點的next字段的指針,而不是保持指向下一個節點的指針class

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0

typedef struct Node {
    struct Node *next;
    int value;
} LinkList;

//
int linkInsert(LinkList **nextPtr, int value)
{
    LinkList *current;
    LinkList *new;

    //nextPtr爲指向當前節點的next字段的指針
    while ((current = *nextPtr) != NULL && value > current -> value) {
        nextPtr = &current -> next;
    }

    new = malloc(sizeof(LinkList));
    if (new == NULL) {
        return FALSE;
    }

    new-> value = value;
    new-> next = current;
    //前一個節點指向最新的節點,即便是表頭也能夠正常處理
    *nextPtr = new;

    return TRUE;
}

int main()
{
    LinkList third = {NULL, 4};
    LinkList second = {&third, 2};
    LinkList first = {&second, 1};  //把head當作next字段,指向第一個節點
    LinkList *head = &first;
    LinkList **nextPtr = &head;

    linkInsert(nextPtr, 3);

    LinkList *current = *nextPtr;
    while(current != NULL){
        printf("%d\t", current -> value);
        current = current -> next;
    }

    return 0;
}
相關文章
相關標籤/搜索