單鏈表插入:
(1)找到位置p(ai-1)
(2)生成新結點s,數據域賦值
(3)新結點指針域指向ai(ai的地址存放在ai-1的指針域)
(4)ai-1的指針域指向新結點s
直接上代碼:
Status InsertList(LinkList head,DataType x,int i) { ListNode* p; p=head; int j=1; while(p && j<i) { p=p->next; j++; } //p現在是ai-1這個結點 if(!p || j>i) { printf("Position Error!"); return ERROR; } ListNode* s=(ListNode*)malloc(sizeof(ListNode)); s->data=x; s->next=p->next p->next=s; return OK; }
刪除單鏈表結點:
(1)找到要刪除的結點前一個結點p(原因是刪除結點的位置在前一個結點的指針域)
(2)把p->next指向ai的下一個結點(把ai從鏈上摘除)
(3)釋放ai空間
直接粗暴上代碼:
Status DeleteList(LinkList head,int i) { ListNode* p,*r; //聲明兩個指針,一個用來找到刪除結點前的結點。 一個用來存儲要刪除結點的后繼結點的地址的。 p=head; int j=1; while(p->next && j<i) //這里要判斷p->next得是真(也就是說得有后繼結點也就是要刪除的結點)。。。//不要忘了這個方式 p=p->next; 指針在移動 { p=p->next; j++; } if(p->next ==NULL || j>i) { printf("Position Error!"); return ERROR; } r=p->next; //把刪除結點的首地址給臨時結點 這樣就能把刪除結點的指針域保存下來 p->next=r->next; //刪除結點的指針域 指向 刪除結點后繼結點的首地址 free(r); //記得釋放資源 retuen OK; }
刪除結點必須保證在連邊長度內。即1<=i<=n;
刪除單鏈表頭元素:
兩步:(1)保存頭元素的指針域(即頭元素的后繼節點的首地址)
(2)頭結點指針域指向頭元素的后繼節點。
void RemoveHead(LinkList head) { ListNode * p; p=head->next; head->next=p->next; free(p); }