知識點 1:順序存儲結構需要預分配存儲空間。單鏈表不需要分配存儲空間,元素限制不受控制
2:選擇順序存儲結構-線性表需要頻繁查找,很少進行插入和刪除操作。使用單鏈表結構-元素個數變化較大或者根本不知道有多大時
3:鏈表改不改變,應該准確理解為鏈表頭指針地址是否改變。
增、刪、改的是非頭結點時,加不加&符號,原鏈表都會相應改變;但一旦頭指針改變,沒加&符號的函數會導致程序出錯;
所以一般寫增加、刪除、插入節點的函數時,為了保證涉及到頭指針的修改不出錯(尤其是不帶頭結點的鏈表),都需要加上&。
鏈表的第一個結點明確知道是不會改變的,故頭指針地址不會改變,所以不用加&。
4:
1)傳值方式傳參
①傳地址:
在函數中如果傳遞的是指針,那么只能修改指針指向的內容,不能修改指針本身;如果想要修改指針本身,要么在再加一級指針,要么用引用&。
②引用傳參:
引用傳參往往要比值傳參高效,因為它是直接將x作為參數傳入進去,而少了對x進行復制這部分的開銷,既然傳入進去的是x,那么對x的修改肯定也生效
2)引用方式傳參引用可以被理解為變量的一個別名,但這依舊是原變量,如果在函數內對該變量進行修改的話,在外部該變量也會相應被修改。
總結
在傳值方式傳參時,對於基本類型:函數參數為int x,調用函數傳入x;對於指針:函數參數為LNode *,調用函數時傳入L
在地址傳遞時,對於基本類型:函數參數為int *x,調用函數傳入&x;對於指針:函數參數為LNode **,調用函數時傳入&L。
在引用方式傳參,對於基本類型:函數參數為int &x,調用函數傳入x;對於指針:函數參數為LNode* &L(或LinkList &L ),調用函數時傳入&L。
typedef struct Link { int elem; struct Link *next;//指針域 }LinkNode,*LinkList; //以下新建節點等價 //LinkNode *tnode1 = (linkNode *)malloc(sizeof(linkNode)); //LinkList tnode = (LinkList)malloc(sizeof(linkNode));
創建頭結點
LinkList createLinkListHead() { LinkList head = (LinkList) malloc(sizeof(LinkNode)); head->next = NULL; return head; }
帶頭結點的頭插法
void insertHeadLinkList(LinkList head, int value) { LinkList node = (LinkList) malloc(sizeof(LinkNode)); node->elem = value; node->next = head->next; head->next = node; }
尾插法
void insertLastLinkList(LinkList head, int value) { LinkList temp = head; while (temp->next != NULL) //找到末尾結點 temp = temp->next; LinkList node = (LinkList) malloc(sizeof(LinkNode)); node->elem = value; temp->next = node; node->next = NULL; }
插入指定位置
void insertPositionLinkList(LinkList head, int position, int value) { if (position < 0) //-1 從末尾添加,采用尾插法 insertLastLinkList(head,value); else if (position == 0) //從第一個結點插入,采用頭插法 insertHeadLinkList(head,value); else { // LinkList temp = head->next; while (temp != NULL && --position > 0) { //找到合適的位置結點 temp = temp->next; } LinkList node = (LinkList) malloc(sizeof(LinkNode)); node->elem = value; node->next = temp->next; temp->next = node; } }
刪除指定位置節點
void deletePositionLinkList(LinkList head, int position) { if (position < 0) { printf("指定下標值不正確\n"); return; } LinkList node = head; int i = 0; while (!node->next || i < position) { //尋找指定下標的節點,結束循環時,i==position node = node->next; i++; } if (i == position) { //找到指定節點 LinkList temp = node->next; //temp 是要被刪除的節點 node->next = temp->next; temp->next = NULL; printf("該位置值為%d\n",temp->elem); free(temp); } else { //沒找到 printf("沒找到指定下標的值"); } }
刪除指定數據節點
void deleteValueLinkList(LinkList head, int value) { LinkList node = head; while (!node->next) { if (node->next->elem == value)break;//找到前節點 node = node->next; } if (node->next != NULL) { //找到要刪除的節點 LinkList temp = node->next; //temp 是要被刪除的節點 node->next = temp->next; temp->next = NULL; free(temp); } else { printf("沒找到要刪除的節點\n"); } }
銷毀鏈表
void destoryLinkList(LinkList head) { while (head->next != NULL) { LinkList node = head->next; head->next = node->next; free(node); } }