在存儲一大波數的時候,我們通常使用數組,但有時候數組顯得不夠靈活。比如需要向一組已經排好序的數中插入一個數,插入后仍然是按從小到大的順序。如果用數組來實現這一操作,需要把這個數以后的所有數往后移,這樣的操作顯然很耽誤時間。這里,用鏈表會很省時間的解決這一問題。
在c語言中,可以使用指針和動態分配內存函數malloc來實現。
指針用來存儲一個內存空間的地址;
malloc函數的作用是從內存中申請分配指定字節大小的內存空間。
如,malloc(4);此代碼申請了4個字節的內存空間,等同于malloc(sizeof(int));。需要記住,在程序中使用malloc函數時需要用到stdlib.h頭文件。
相應代碼:
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<cstdio>#include<cstdlib>using namespace std;//創建一個結構體用來表示鏈表的結點的類型struct node { int data; struct node *next;//指針用來存儲下一個結點的地址,因為下一個結點的類型是struct node,所以這個指針的類型也必須是struct node *類型的指針};int main() { struct node *head, *p, *q=0, *t; int n, a; scanf("%d", &n); head = NULL;//頭指針初始為空 for (int i = 1; i <= n; i++) { scanf("%d", &a); //動態申請一個空間,用來存放一個結點,并用臨時指針p指向這個結點 p = (struct node *)malloc(sizeof(struct node)); p->data = a;//將數據存儲到當前結點的data域中 p->next = NULL;//設置當前結點的后繼指針指向空 if (head == NULL) head = p;//如果這是第一個創建的結點,則將頭指針指向這個結點 else q->next = p;//如果不是第一個創建的結點,則將上一個結點的后繼指針指向當前結點 q = p;//指針q也指向當前結點 } scanf("%d", &a);//讀入待插入的數 t = head;//從鏈表頭部開始遍歷 while (t != NULL) {//當沒有到達鏈表尾部時循環 if (t->next == NULL || t->next->data > a) {//如果當前結點是最后一個或者下一個結點的值大于待插入數時 p = (struct node *)malloc(sizeof(struct node));//動態申請一個空間,用來存放新增節點 p->data = a; p->next = t->next;//新增節點的后繼指針指向當前結點的后繼指針所指向的結點 t->next = p;//當前結點的后繼針針指向新增結點 break;//插入完畢退出循環 } t = t->next;//繼續下一個結點 } //輸出鏈表中的所有數 t = head; while (t != NULL) { PRintf("%d ", t->data); t = t->next; } system("pause"); return 0;}代碼實現:

新聞熱點
疑難解答