標籤:指標 ext str null namespace 表頭 插入 The illegal
程式構思:單鏈表的建立
(1) 先建立頭結點head,將頭結點的指標域置為空白。
(2) 建立一個指向頭結點的指標m,即Node *m = head;(首端插入方式不需要該步驟)。
(3) 建立一個結點p,把此新結點連結到單鏈表的尾端(p->next設為空白)或者始端。
1??首端插入方式
? ①p->next指向頭結點指向的下一個結點head->next。
? ②head->next指向p。
2??尾端插入方式。
? ①m->next指向p,即m->next = p;
? ②把指標p賦值給m,也就是說每次m都要最終指向新插入的結點。m = p;
單鏈表的插入
(1) 建立一個結點p,指定插入位置。
(2) 從單鏈表開始尋找結點位置。
? ①找到該位置,則p->next指向當前位置的下一個結點,當前位置結點指向建立結點p。
? ②沒有找到該位置,插入操作失敗。
單鏈表的刪除
(1) 指定刪除位元置。
(2) 鏈表頭開始找到結點位置。
? ①找到該位置,則刪除該位置的結點。
? ②沒有找到該位置,刪除操作失敗。
範例程式碼
#include <iostream>#include <stdlib.h>#include <cstdio>using namespace std; typedef int ElementType; //指定單鏈表中資料類型 //單鏈表格儲存體結構定義typedef struct Node{ ElementType data; //資料域 struct Node *next; //指標域}*LinkList; #pragma mark - 建立一個空線性表/單鏈表(方法一)/****----------------------------------------------****///單鏈表建立方法一(函數用傳回值得到表頭指標)//函數名: CreateOne(int n)//參數: (傳入)int n, 傳入線性表結點數量//作用: 建立一個空線性表//傳回值:Node *型返回結構體指標,即得到建立的線性表頭指標/****---------------------------------------------****/ Node* CreateOne(int n){ int i; Node *head; //定義頭結點指標 Node *p; //定義新結點指標 //建立帶頭結點的線性鏈表 head = (Node*)malloc(sizeof(Node)); head->next = NULL; cout << "Please input the data for LinkList Nodes:" << endl; /** 該鏈表建立並初始化採用的是從表尾插入n個元素,比如如果輸入的是:1 2 3,那麼輸出鏈表時會輸出3 2 1 */ /* for (i = n; i > 0; i--) { p = (Node*)malloc(sizeof(Node)); //為新結點申請空間,即建立一個新結點 scanf("%d", &p->data); //新結點賦值 //新結點插入到表頭 p->next = head->next; head->next = p; } */ /** 該鏈表建立並初始化採用的是從表頭插入n個元素,比如輸入的是:1 2 3, 那麼輸出的順序也是會: 1 2 3 */ Node *tempNode = head; for (i = n; i > 0; i--) { p = (Node*)malloc(sizeof(Node)); //為新結點申請空間,即建立一個新結點 scanf("%d", &p->data); //新結點賦值 //新結點插入到表尾 tempNode->next = p; tempNode = p; } tempNode->next = NULL; return head; //返回頭結點指標,即可以得到單鏈表的地址} #pragma mark - 建立一個空線性表/單鏈表(方法二)/****----------------------------------------------****///單鏈表建立方法二(函數無傳回值)//函數名: CreateTwo(Node* head, int n)//參數: (傳入)Node* head傳入一個鏈表指標// (傳入)int n,傳入線性表結點數量//作用: 建立一個空線性表//傳回值: 無/****---------------------------------------------****/ void CreateTwo(Node *head, int n){ int i; Node *p; //定義新結點指標 //建立帶頭結點的線性鏈表 head = (LinkList)malloc(sizeof(Node)); head->next = NULL; cout << "Please input the data for LinkList Nodes:" << endl; for (i = n; i > 0; i--) { p = (Node*)malloc(sizeof(Node)); //為新結點申請空間,即建立一新結點 scanf("%d", &p->data); //為新結點賦值 //新結點插入到表頭 p->next = head->next; head->next = p; }} #pragma mark - 向單鏈表中插入一個元素/****----------------------------------------------****///函數名: InsertNode(Node *L, int i, ELementType e)//參數: (傳入)Node *L,傳入線性表頭指標L// (傳入)int i插入位置// (傳入)ELementType e插入元素//作用: 線性表中插入一個元素//傳回值: int型,返回1表示操作成功,0表示失敗/****---------------------------------------------****/int InsertNode(Node *L, int i, ElementType e){ Node *p = L; //定義一個指向第一個結點的指標 int j = 0; //順指標向後尋找, 直到p指向第一個結點 while (p && j < i) { p = p->next; j++; } //插入位置合法性判斷 if (!p || j > i) { cout << "Error! The location is illegal!" << endl; return 0; } Node *s; s = (Node*)malloc(sizeof(Node)); //建立新結點 s->data = e; //新結點賦值 //插入結點 s->next = p->next; p->next = s; return 1;} #pragma mark - 刪除單鏈表中的一個元素/****----------------------------------------------****///函數名: DeleteNode(LinkList &L, int i, ELementType &e)//參數: (傳入)LinkList &L,線性表頭指標L的地址// (傳入)int i刪除位元置// (傳出)ElementType &e 儲存刪除節點元素的值//作用: 線性表中刪除一個元素//傳回值: ElementType型返回刪除結點元素的值/****---------------------------------------------****/ElementType DeleteNode(LinkList &L, int i, int &e){ Node *p; p = L; //定義一個指向第i個結點的指標p Node *q; //暫時存放待刪除結點 int j = 0; //順指標向後尋找,直到p指向第i個結點 while (p->next && j < i) { p = p->next; j++; } //刪除位元置合法性判斷 if (!p || j > i) { cout << "element is not exist!"; return 0; } q = p->next; p->next = q->next; //刪除第i個結點 e = q->data; free(q); return e; //返回刪除結點元素的值} #pragma mark - 顯示線性表中的所有元素/****----------------------------------------------****///函數名: DisplayList(LinkList &L)//參數: (傳入)LinkList &L,線性表頭指標L的地址//作用: 顯示線性表中所有元素//傳回值: 無/****---------------------------------------------****/void DisplayList(LinkList &L){ Node *p; p = L->next; //定義一個指向表頭結點的指標p while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n");} #pragma mark - 主函數int main(int argc, const char * argv[]) { Node *L1; int NodeNum; printf("Please input the Init LinkNode Number:\n"); scanf("%d", &NodeNum); L1 = CreateOne(NodeNum); //Node *L2; //CreateTwo(L2, NodeNum); //也可以這樣產生L2鏈表 //輸出當前鏈表內容 printf("the current L1 is:"); DisplayList(L1); //調用 int result; //為了判斷調用成功與否,可以定義result以備檢查 result = InsertNode(L1, 3, 88); if (result) { printf("success to insert!\n"); } ElementType deleteNumber; DeleteNode(L1, 0, deleteNumber); printf("被刪除的元素為: %d\n", deleteNumber); //輸出當前鏈表的內容 printf("the curent L1 is:"); DisplayList(L1); return 0;}
單鏈表