.[題目分析] 在單鏈表中刪除自第i個元素起的共len個元素應從第個元素起開始計數記到第i個時開始數len個然後將第i個元素的後繼指針指向第i+len個結點實現了在A鏈表中刪除自第i個起的len個結點這時應繼續查到A的尾結點得到刪除元素後的A鏈表再查B鏈表的第j個元素將A鏈表插入之插入和刪除中應注意前驅後繼關系不能使鏈表斷鏈另外算法中應判斷ilen和j的合法性
LinkedList DelInsert(LinkedList headaheadbint ijlen)∥heada和headb均是帶頭結點的單鏈表本算法刪除heada鏈表中自第i個元素起的共len個元素然後將單鏈表heada插入到headb的第j個元素之前
{if(i< || len< || j<){printf(參數錯誤\n);exit();}∥參數錯退出算法
p=heada;∥p為鏈表A的工作指針初始化為A的頭指針查到第i個元素時p指向第i個元素
k=;∥計數
while(p!=null && k<i)∥查找第i個結點
{k++;p=p>next;}
if(p==null){printf(給的%d太大\ni);exit();}∥i太大退出算法
q=p>next;∥q為工作指針初始指向A鏈表第一個被刪結點
k=;
while(q!=null && k<len){k++;u=qq=q>next;free(u);}∥刪除結點後移指針
if(k<len){printf(給的%d太大\nlen);exit();}
p>next=q;∥A鏈表刪除了len個元素
if (heada>next!=null)∥heada>next=null說明鏈表中結點均已刪除無需往B表插入
{while(p>next!=null)p= p>next;∥找A的尾結點
q=headb;∥q為鏈表B的工作指針
k=;∥計數
while(q!=null && k<j)∥查找第j個結點
{k++;q= q>next;}∥查找成功時q指向第j個結點
if(q==null){printf(給的%d太大\nj);exit();}
p>next=q>next;∥將A鏈表鏈入
q>next=heada>next;∥A的第一元素結點鏈在B的第j個結點之後
}//if
free(heada);∥釋放A表頭結點
}∥算法結束
[] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/sjjg/201311/23337.html