線性表&單鏈表

線性表
**   **線性表也叫做順序表,是最基本、最簡單、也是最常用的一種數(shù)據(jù)結構。線性表中數(shù)據(jù)元素之間的關系是一對一的關系,即除了第一個和最后一個數(shù)據(jù)元素之外,其它數(shù)據(jù)元素都是首尾相接的。
  它的有點是訪問方便、直接,但是不足是在插入、刪除時需要的內存空間因為不確定而往往比較大。


單鏈表
  鏈表中的數(shù)據(jù)是以結點來表示的,每個結點的構成:元素(數(shù)據(jù)元素的映象) + 指針(指示后繼元素存儲位置),元素就是存儲數(shù)據(jù)的存儲單元,指針就是連接每個結點的地址數(shù)據(jù)。所以每個結點都是一個結構體。這里需要注意的是,在定義結構體的時候,結構體里面的變量必須是能夠明確確定內存空間的。


#include <stdio.h>
#include <stdlib.h>

//定義結點的樣式
typedef struct node{
    char *name;//變量保存的是地址
    struct node *next;//指向下一個結點的指針
}Node;

void myFree(Node *pHead){
    while (pHead != NULL) {
        //保存下一個結點的地址
        Node *pTemp = pHead->next;
        
        //首先釋放name對應的內存空間
        free(pHead->name);
        
        //再釋放結點本身
        free(pHead);
        
        //pHead指向下一個
        pHead = pTemp;
    }
}

int main(int argc, const char * argv[]) {
    
    Node *pHead = NULL;
    Node *pTail = NULL;
    
    for (int i = 0; i < 3; i++) {
        int total = 0;//記錄當前保存字符的個數(shù)
        
        //創(chuàng)建一個新的結點
        Node *pTemp = (Node *)malloc(1 * sizeof(Node));
        if (pTemp == NULL) {
            myFree(pHead);
            exit(EXIT_FAILURE);
        }
        
        //輸入數(shù)據(jù)
        //為name分配一片內存空間
        printf("請輸入名字:");
        char character;
        while (1) {
            //獲取一個字符
            character = getchar();
            
            //判斷這個字符是不是'\n'
            if (character == '\n'){
                //輸入完畢了
                break;
            } else{
                //保存
                //判斷是不是第一次來分配內存空間
                if (pTemp->name == NULL) {
                    //第一次 使用malloc
                    pTemp->name = (char *)malloc(1 * sizeof(char));
                    if (pTemp->name == NULL) {
                        exit(EXIT_FAILURE);
                    }
                } else{
                    pTemp->name = (char *)realloc(pTemp->name, (total+1)*sizeof(char));
                    if (pTemp->name == NULL) {
                        exit(EXIT_FAILURE);
                    }
                }
                
                pTemp->name[total] = character;
                
                total++;
            }
        }
        
        //這個結點的next指針賦初值
        pTemp->next = NULL;
        
        //判斷是將這個結點+到head 還是tail
        if (pHead == NULL) {
            pHead = pTemp;
            pTail = pTemp;
        } else{
            pTail->next = pTemp;
            pTail = pTemp;
        }
    }
    
    Node *pTemp = pHead;
    while (pTemp != NULL) {
        printf("%s\n", pTemp->name);
        pTemp = pTemp->next;
    }
    printf("\n");
    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容