1:首先參考別人的單鏈表的創建及打印,代碼如下:

#include "stdafx.h" #include<stdio.h> #include<malloc.h> typedef struct LNode { int data; struct LNode *next; }LNode; /*上面只是定義了一個結構體類型,並未實際分配內存空間 只有定義了變量才分配內存空間*/ LNode *creat(int n) { int i; LNode *head, *p1, *p2; /*head用來標記鏈表,p1總是用來指向新分配的內存空間, p2總是指向尾結點,並通過p2來鏈入新分配的結點*/ int a; head = NULL; p2 = NULL; for (i = 1; i <= n; i++) { p1 = (LNode *)malloc(sizeof(LNode)); /*動態分配內存空間,並數據轉換為(struct LNode)類型*/ printf("請輸入鏈表中的第%d個數:", i); scanf_s("%d", &a); p1->data = a; if (head == NULL)/*指定鏈表的頭指針*/ { head = p1; p2 = p1; } else { p2->next = p1; p2 = p1; } p2->next = NULL;/*尾結點的后繼指針為NULL(空)*/ } return head;/*返回鏈表的頭指針*/ } void main() { int n; LNode *q; printf("請輸入鏈表的長度:/n"); scanf_s("%d", &n); q = creat(n);/*鏈表的頭指針(head)來標記整個鏈表*/ printf("/n鏈表中的數據:/n"); while (q)/*直到結點q為NULL結束循環*/ { printf("%d ", q->data);/*輸出結點中的值*/ q = q->next;/*指向下一個結點*/ } }
運行結果:
2:再將上面的代碼改進,把打印改進成函數的形式,代碼如下:

#include "stdafx.h" #include<stdio.h> #include<malloc.h> typedef struct LNode { int data; struct LNode *next; }LNode; /*上面只是定義了一個結構體類型,並未實際分配內存空間 只有定義了變量才分配內存空間*/ LNode *creat(int n) { int i; LNode *head, *p1, *p2; /*head用來標記鏈表,p1總是用來指向新分配的內存空間, p2總是指向尾結點,並通過p2來鏈入新分配的結點*/ int a; head = NULL; p2 = NULL; for (i = 1; i <= n; i++) { p1 = (LNode *)malloc(sizeof(LNode)); /*動態分配內存空間,並數據轉換為(struct LNode)類型*/ printf("請輸入鏈表中的第%d個數:", i); scanf_s("%d", &a); p1->data = a; if (head == NULL)/*指定鏈表的頭指針*/ { head = p1; p2 = p1; } else { p2->next = p1; p2 = p1; } p2->next = NULL;/*尾結點的后繼指針為NULL(空)*/ } return head;/*返回鏈表的頭指針*/ } void print(LNode *head) { LNode *p; p = head; while (p)/*直到結點q為NULL結束循環*/ { printf("%d ", p->data);/*輸出結點中的值*/ p = p->next;/*指向下一個結點*/ } } void main() { int n; LNode *q; printf("請輸入鏈表的長度:"); scanf_s("%d", &n); q = creat(n);/*鏈表的頭指針(head)來標記整個鏈表*/ print(q); }
運行結果:
3:最終將自己的代碼改進,代碼如下:

// ConsoleApplication15.cpp : 定義控制台應用程序的入口點。 // #include "stdafx.h" #include <malloc.h> typedef struct node//定義鏈表結構體 { int data;//節點內容 node *next;//指向結構體的指針,下一個節點 }node; node *create()//創建單鏈表 { int i = 0;//鏈表中數據的個數 node *head, *p, *q;//這些的本質是節點的地址 int x = 0; head = NULL; q = NULL;//初始化q,q代表末節點 p = NULL; while (1) { printf("please input the data:"); scanf_s("%d", &x); if (x == 0) break;//data為0時創建結束 p = (node *)malloc(sizeof(node));//用於每次輸入鏈表的數據 p->data = x; if (++i == 1)//鏈表頭的指針指向下一個節點 { head = p; q = p; } else { q->next = p;//連接到鏈表尾端 q = p; } q->next = NULL;/*尾結點的后繼指針為NULL(空)*/ } return head; } int length(node *head) { int len = 0; node *p; p = head->next; while (p != NULL) { len++; p = p->next; } return len; } void print(node *head) { node *p; p = head; while (p)/*直到結點q為NULL結束循環*/ { printf("%d ", p->data);/*輸出結點中的值*/ p = p->next;/*指向下一個結點*/ } } int main() { node *head = create();//創建單鏈表 printf("Length:%d\n", length(head)); print(head); return 0; }
運行結果: