按照你的要求,不使用數(shù)組。
創(chuàng)新互聯(lián)服務(wù)緊隨時(shí)代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10多年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對網(wǎng)站進(jìn)行做網(wǎng)站、網(wǎng)站設(shè)計(jì)、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。
我的思路,起點(diǎn)貨物狼、羊、白菜,人一直在開船,通過遞歸函數(shù),每次靠岸嘗試裝卸貨方案,直到找滿足條件的方案。將可行方案存放在結(jié)構(gòu)鏈表中形成操作流水打印。
人狼羊菜存儲(chǔ)方式模擬4位2進(jìn)制,用1111表示,每位表示一個(gè)單位,1存在,0不存在。
#includestdio.h
#includemalloc.h
typedef?enum{false,true}bool;
typedef?struct?opRecord//用結(jié)構(gòu)鏈表記錄操作流水
{
int?p1_take;//p1載貨值
int?p1_goAd;//p1卸貨值
int?p2_take;//p2載貨值
int?p2_goAd;//p2卸貨值
int?cen;//遞歸層號
struct?opRecord?*next;
}OPR;
OPR?*oprHead;
OPR?*oprTail;
char?*getName(int?b);//獲取對應(yīng)名稱
int?beEaten(int?p1,int?p2);//檢查是否發(fā)生被吃事件,發(fā)生返回1,未發(fā)生返回0
int?toShip(int?*p1,int?*p2,int?*ship,bool?f);//遞歸函數(shù):上船人及任意一組合,返回狀態(tài),1:方案可行;0:方案不可行
int?getFist(int?pn);//獲取物品組合中第一個(gè)
void?addLog(int?p1_take,int?p1_goAd,int?p2_take,int?p2_goAd,int?cen);//將有效操作添加進(jìn)日志,cen相同,將視為修改覆蓋
void?printfLog();//打印操作流水
OPR?*findLogBycen(int?cen);//通過cen查找流水。?有返回節(jié)點(diǎn)指針。無返回NULL
int?count=1;
int?flag=0;//標(biāo)識(shí)變量=1成立;??=0不成立
int?cen=0;
int?main()
{
int?p1=111,ship=1000,p2=0000;//p1,p2分別表示兩岸,4位數(shù)每一位分別表示人狼羊菜,位數(shù)值1表示存在,0表示不存在
oprHead=(OPR?*)malloc(sizeof(OPR));
oprHead-next=NULL;
oprTail=NULL;
printf("河岸有人、狼、羊、白菜要過河,船每次載人及一物,為避免人上船后狼吃羊或羊吃菜\n開始生成方案:\n\n");
if(toShip(p1,p2,ship,0))
{
printf("\n開始生成結(jié)果報(bào)告:\n");
printfLog();
}
else
printf("無可行方案!!\n");
return?0;
}
void?addLog(int?p1_take,int?p1_goAd,int?p2_take,int?p2_goAd,int?cen)//將有效操作添加進(jìn)日志,cen相同,將視為修改覆蓋,
{
OPR?*oprNew=findLogBycen(cen);
if(oprNew==NULL)//通過查找。確認(rèn)無記錄,新增記錄
{
oprNew=(OPR?*)malloc(sizeof(OPR));
oprNew-p1_take=p1_take;
oprNew-p1_goAd=p1_goAd;
oprNew-p2_take=p2_take;
oprNew-p2_goAd=p2_goAd;
oprNew-cen=cen;
oprNew-next=NULL;
if(oprHead-next==NULL)
oprHead-next=oprNew;
else
oprTail-next=oprNew;
oprTail=oprNew;
}
else//查找發(fā)現(xiàn)已有記錄,修改
{
oprNew-p1_take=p1_take;
oprNew-p1_goAd=p1_goAd;
oprNew-p2_take=p2_take;
oprNew-p2_goAd=p2_goAd;
}
}
OPR?*findLogBycen(int?cen)//通過cen查找流水。?有返回節(jié)點(diǎn)指針。無返回NULL
{
OPR?*headSave=oprHead;
while(headSave-next!=NULL)
{
if(headSave-next-cen==cen)
return?headSave-next;
headSave=headSave-next;
}
return?NULL;
}
void?printfLog()//打印操作流水
{
OPR?*headSave=oprHead;
int?p1_take,p1_goAd,p2_take,p2_goAd,cen,p1TOp2,p2TOp1;
while(headSave-next!=NULL)
{
p1_take=headSave-next-p1_take;
p1_goAd=headSave-next-p1_goAd;
p2_take=headSave-next-p2_take;
p2_goAd=headSave-next-p2_goAd;
cen=headSave-next-cen;
if(p1_take0?||?p1_goAd0)
p1TOp2=1;
else
p1TOp2=0;
if(p2_take0?||?p2_goAd0)
p2TOp1=1;
else
p2TOp1=0;
printf("操作流水%2d:",cen);
printf("%s%s",p1TOp20?"從p1":"",p2TOp10?"從p2":"");
printf("%s%s",p1_goAd0?getName(p1_goAd):"",p1_goAd0?"下船":"");
printf("%s%s",p1_take0?getName(p1_take):"",p1_take0?"上船":"");
printf("%s%s",p2_goAd0?getName(p2_goAd):"",p2_goAd0?"下船":"");
printf("%s%s",p2_take0?getName(p2_take):"",p2_take0?"上船":"");
if(headSave-next-next!=NULL)
printf("。之后行駛方向:%s%s\n",p1TOp20?"p1-p2":"",p2TOp10?"p1-p2":"");
else
printf("\n");
headSave=headSave-next;
}
}
char?*getName(int?b)//獲取對應(yīng)名稱
{
if(b==1000)
return?"人";
else?if(b==100)
return?"狼";
else?if(b==10)
return?"羊";
else?if(b==1)
return?"菜";
return?"";
}
int?toShip(int?*p1,int?*p2,int?*ship,bool?f)//遞歸函數(shù):上船人及任意一組合;lastTake:上一次承載物體,首次調(diào)用傳0;f=0:p1-p2方向;1:反向。返回狀態(tài),1:方案可行;0:方案不可行;
{
int?take=-1,goAd,gdflag=1,cenSave;//take:上船物體。??goAd:下船物體。gdflag:標(biāo)識(shí)變量,p2判斷能否直接下船,1能0不能
cenSave=++cen;
while(1)
{
goAd=*ship-1000;
if(f==0)//準(zhǔn)備p1往p2
{
if(take==-1)
take=getFist(*p1);
*p1-=take;
*p1+=goAd;
gdflag=1;//標(biāo)識(shí)置1,等到p2首先嘗試直接卸貨
}
else//準(zhǔn)備p2往p1
{
if(take==-1??gdflag==0)
{
take=getFist(*p2);
printf("開始嘗試替換貨物:\n");
}
if(gdflag==1)//如果p2可以直接卸貨
*p2+=goAd;
else//如果不能直接卸貨,嘗試帶走一個(gè)同時(shí)卸貨
{
*p2-=take;
*p2+=goAd;
}
}
printf("遞歸層級%d:假設(shè)%s從%s上船。%s下船,%s方向行駛。\n",cenSave,take0?getName(take):"無貨物",f==0?"p1":"p2",goAd!=0?getName(goAd):"無貨物",f==0?"p1往p2":"p2往p1");
if(beEaten(*p1,*p2))//如果發(fā)生被吃,假設(shè)失敗,還原數(shù)據(jù),選擇下一假設(shè)
{
if(f==0)
{
*p1+=take;
*p1-=goAd;
}
else
{
if(gdflag==1)//p2點(diǎn)確定不能直接卸貨,還原數(shù)據(jù),標(biāo)識(shí)置0
{
printf("----不能直接卸貨,貨物%s回到船上。",getName(goAd));
*p2-=goAd;
gdflag=0;
continue;
}
else//不能直接卸貨并嘗試替換貨物失敗,選擇下一個(gè)貨物替換
{
*p2+=take;
*p2-=goAd;
}
}
if(take==1)
{
printf("本次靠岸無可行的裝卸方案,返回層級%d!\n",cenSave-1);
return?0;
}
take=take/10;//嘗試選擇下一個(gè)貨物
continue;
}
else
{
if(f==1??gdflag==1)//p2直接卸貨假設(shè)成立船清空
*ship=1000;
else
*ship=1000+take;//換貨假設(shè)成立貨物裝船
if(*p1==0)//如果已經(jīng)完全轉(zhuǎn)移
{
printf("所有貨物過河成功?。n");
return?1;
}
if(f==0)
addLog(take,goAd,0,0,cenSave);//生成流水日志
else
addLog(0,0,take,goAd,cenSave);//生成流水日志
if(toShip(p1,p2,ship,f==0?1:0))
{
return?1;
}
else//由于下級失敗,本回合重新選擇
{
gdflag=0;
continue;
}
}
}
}
int?getFist(int?pn)//獲取物品組合中第一個(gè)
{
int?i,count=0;
while(1)//上船物體從岸上第一個(gè)物體開始選擇
{
if(pn=1)
break;
pn=pn/10;
count++;
}
for(i=0;icount;i++)
pn=pn*10;
return?pn;
}
int?beEaten(int?p1,int?p2)//檢查是否發(fā)生被吃事件,發(fā)生返回1,未發(fā)生返回0
{
int?ren=0;
if(p1==110??++ren==1)
printf("----河岸p1狼把羊吃了!重新選擇\n");
if(p2==110??++ren==1)
printf("----河岸p2狼把羊吃了!重新選擇\n");
if(p1==11??++ren==1)
printf("----河岸p1羊把菜吃了!重新選擇\n");
if(p2==11??++ren==1)
printf("----河岸p2羊把菜吃了!重新選擇\n");
return?ren;
}
好久不寫了
寫一個(gè)程序,建立N元整型數(shù)組,然后輸入查找的整數(shù)x,查找x是否包含在數(shù)組中,查找用函數(shù)實(shí)現(xiàn),若查找成功,返回x在數(shù)組中的第一次出現(xiàn)的下標(biāo),查找失敗,返回-1
源程序:
#include"stdio.h"
#define N 10
int locate(int a[N],int x)
{int h,r,m;
h=0;r=N-1;m=(h+r)/2;
while(h=rx!=a[m])
if(xa[m]) {r=m-1;m=(h+r)/2;}
else {h=m+1;m=(h+r)/2;}
if(hr) return -1; /*查找失敗,返回-1*/
return m; /*查找成功,返回有效下標(biāo)m */
}
void upinsert(int a[],int i) /*插入排序 (升序)*/
{int x,j;
x=a[i];j=i-1;
while(j=0a[j]x) {a[j+1]=a[j];j--;}
a[j+1]=x;
}
void main()
{int a[N],x,k,n;
printf("input %d integers:\n",N);
for(k=0;kN;k++) {scanf("%d",a+k);upinsert(a,k);}
printf("input x=") ;scanf("%d",x);
n=locate(a,x);
for(k=0;kN;k++) printf("%4d",a[k]);
printf("\n fist position=%d\n",n);
}
沒有錯(cuò)誤,我試過了
這個(gè)程序沒錯(cuò),我在VC上可以運(yùn)行。這個(gè)程序?qū)嶋H上就是將一個(gè)字符串中指定位置上的字符刪除掉。下面解釋兩個(gè)語句的意思。
假如輸入:
abcdefg
4
輸出:
abcefg
p+=position-1; 相當(dāng)于 p = p + (position-1); 也就是將指針 p 從字符串首部移動(dòng)到 (position - 1)個(gè)位置。一開始 p 指向 'a',現(xiàn)在 p 指向 'd'。
while((*p++=*(p+1))!='\0'); 相當(dāng)于
while(p!='\0'){ *p=*(p+1); p++;} 也就是不斷地將后一個(gè)元素取代前一個(gè)元素,'d'被'e'取代,'e'被‘f'取代,如此直到字符串末尾。
1, 找到VS的cl.exe所在目錄,把這目錄復(fù)制下來:
我的VS2008的CL.EXE目錄是在E:\Program Files\Microsoft Visual Studio 9.0\VC\bin,
VS2010可以類似的找到..
在'我的電腦'上點(diǎn)右鍵,
選右鍵菜單'屬性'-'高級'-'環(huán)境變量',
在彈出的環(huán)境變量設(shè)置框里找"PATH"這個(gè)變量, (在用戶變量或系統(tǒng)變量里都可以)
然后在"PATH"的值后面,用分號分隔,
把將才找到的路徑串復(fù)制進(jìn)去,選確定.
2, 重新運(yùn)行CMD開啟新的命令窗.
3, 輸入cl回車檢查PATH路徑是否生效.
//以上步聚是設(shè)置環(huán)境變量,只需設(shè)一次以后就好用了.以后每次要命令行下編譯C++程序,就從下面第4步開始.
4, 輸入vcvars32 ,運(yùn)行cl.exe同一路徑下的vcvars32.bat,設(shè)置其它環(huán)境變量.
5, 寫一個(gè)helloworld程序,保存成hello.cpp, cl hello.cpp回車試試編譯正常不. 如果成功,則生成hello.exe文件.
//-----------------------------------------------------------
C/C++ 編譯器選項(xiàng)
-優(yōu)化-
/O1 最小化空間 /Op[-] 改善浮點(diǎn)數(shù)一致性
/O2 最大化速度 /Os 優(yōu)選代碼空間
/Oa 假設(shè)沒有別名 /Ot 優(yōu)選代碼速度
/Obn 內(nèi)聯(lián)展開(默認(rèn) n=0) /Ow 假設(shè)交叉函數(shù)別名
/Od 禁用優(yōu)化(默認(rèn)值) /Ox 最大化選項(xiàng)。(/Ogityb2 /Gs)
/Og 啟用全局優(yōu)化 /Oy[-] 啟用框架指針省略
/Oi 啟用內(nèi)部函數(shù)
-代碼生成-
/G3 為 80386 進(jìn)行優(yōu)化 /Gh 啟用 _penter 函數(shù)調(diào)用
/G4 為 80486 進(jìn)行優(yōu)化 /GH 啟用 _pexit 函數(shù)調(diào)用
/G5 為 Pentium 進(jìn)行優(yōu)化 /GR[-] 啟用 C++ RTTI
/G6 對 PPro、P-II、P-III 進(jìn)行優(yōu)化 /GX[-] 啟用 C++ EH (與 /EHsc 相同)
/G7 對 Pentium 4 或 Athlon 進(jìn)行優(yōu)化 /EHs 啟用 C++ EH (沒有 SEH 異常)
/GB 為混合模型進(jìn)行優(yōu)化(默認(rèn)) /EHa 啟用 C++ EH(w/ SEH 異常)
/Gd __cdecl 調(diào)用約定 /EHc extern "C" 默認(rèn)為 nothrow
/Gr __fastcall 調(diào)用約定 /GT 生成纖維安全 TLS 訪問
/Gz __stdcall 調(diào)用約定 /Gm[-] 啟用最小重新生成
/GA 為 Windows 應(yīng)用程序進(jìn)行優(yōu)化 /GL[-] 啟用鏈接時(shí)代碼生成
/Gf 啟用字符串池 /QIfdiv[-] 啟用 Pentium FDIV 修復(fù)
/GF 啟用只讀字符串池 /QI0f[-] 啟用 Pentium 0x0f 修復(fù)
/Gy 分隔鏈接器函數(shù) /QIfist[-] 使用 FIST 而不是 ftol()
/GZ 啟用堆棧檢查(/RTCs) /RTC1 啟用快速檢查(/RTCsu)
/Ge 對所有函數(shù)強(qiáng)制堆棧檢查 /RTCc 轉(zhuǎn)換為較小的類型檢查
/Gs[num] 控制堆棧檢查調(diào)用 /RTCs 堆棧幀運(yùn)行時(shí)檢查
/GS 啟用安全檢查 /RTCu 未初始化的本地用法檢查
/clr[:noAssembly] 為公共語言運(yùn)行庫編譯
noAssembly - 不產(chǎn)生程序集
/arch:SSE|SSE2 CPU 結(jié)構(gòu)的最低要求,以下內(nèi)容之一:
SSE - 啟用支持 SSE 的 CPU 可用的指令
SSE2 - 啟用支持 SSE2 的 CPU 可用的指令
-輸出文件-
/Fa[file] 命名程序集列表文件 /Fofile 命名對象文件
/FA[sc] 配置程序集列表 /Fpfile 命名預(yù)編譯頭文件
/Fd[file] 命名 .PDB 文件 /Fr[file] 命名源瀏覽器文件
/Fefile 命名可執(zhí)行文件 /FR[file] 命名擴(kuò)展 .SBR 文件
/Fm[file] 命名映射文件
-預(yù)處理器-
/AIdir 添加到程序集搜索路徑 /Fx 將插入的代碼合并到文件
/FUfile 強(qiáng)制使用程序集/模塊 /FIfile 命名強(qiáng)制包含文件
/C 不抽出注釋 /Uname 移除預(yù)定義宏
/Dnametext 定義宏 /u 移除所有預(yù)定義宏
/E 預(yù)處理到 stdout /Idir 添加到包含搜索路徑
/EP 預(yù)處理到 stdout,沒有 #line /X 忽略“標(biāo)準(zhǔn)位置”
/P 預(yù)處理到文件
-語言-
/Zi 啟用調(diào)試信息 /Ze 啟用擴(kuò)展(默認(rèn))
/ZI 啟用“編輯并繼續(xù)”調(diào)試信息 /Zl 省略 .OBJ 中的默認(rèn)庫名
/Z7 啟用舊式調(diào)試信息 /Zg 生成函數(shù)原型
/Zd 僅有行號調(diào)試信息 /Zs 只進(jìn)行語法檢查
/Zp[n] 在 n 字節(jié)邊界上包裝結(jié)構(gòu) /vd 禁用/啟用 vtordisp
/Za 禁用擴(kuò)展(暗指 /Op) /vmx 指向成員的指針類型
/Zc:arg1[,arg2] C++ 語言一致性,這里的參數(shù)可以是:
forScope - 對范圍規(guī)則強(qiáng)制使用標(biāo)準(zhǔn) C++
wchar_t - wchar_t 是本機(jī)類型,不是 typedef
- 雜項(xiàng) -
@file 選項(xiàng)響應(yīng)文件 /won 發(fā)出一次警告 n
/?, /help 打印此幫助消息 /wln 為 n 設(shè)置警告等級 1-4
/c 只編譯,不鏈接 /Wn 設(shè)置警告等級(默認(rèn) n=1)
/Hnum 最大外部名稱長度 /Wall 啟用所有警告
/J 默認(rèn) char 類型是 unsigned /Wp64 啟用 64 位端口定位警告
/nologo 取消顯示版權(quán)消息 /WX 將警告視為錯(cuò)誤
/showIncludes 顯示包含文件名 /WL 啟用單行診斷
/Tcsource file 將文件編譯為 .c /Yc[file] 創(chuàng)建 .PCH 文件
/Tpsource file 將文件編譯為 .cpp /Yd 將調(diào)試信息放在每個(gè) .OBJ 中
/TC 將所有文件編譯為 .c /Yl[sym] 為調(diào)試庫插入 .PCH 引用
/TP 將所有文件編譯為 .cpp /Yu[file] 使用 .PCH 文件
/Vstring 設(shè)置版本字符串 /YX[file] 自動(dòng) .PCH
/w 禁用所有警告 /Y- 禁用所有 PCH 選項(xiàng)
/wdn 禁用警告 n /Zmn 最大內(nèi)存分配(默認(rèn)為 %)
/wen 將警告 n 視為錯(cuò)誤
-鏈接-
/MD 與 MSVCRT.LIB 鏈接 /MDd 與 MSVCRTD.LIB 調(diào)試庫鏈接
/ML 與 LIBC.LIB 鏈接 /MLd 與 LIBCD.LIB 調(diào)試庫鏈接
/MT 與 LIBCMT.LIB 鏈接 /MTd 與 LIBCMTD.LIB 調(diào)試庫鏈接
/LD 創(chuàng)建 .DLL /Fnum 設(shè)置堆棧大小
/LDd 創(chuàng)建 .DLL 調(diào)試庫 /link [鏈接器選項(xiàng)和庫]
如果對您有幫助,請記得采納為滿意答案,謝謝!祝您生活愉快!
/**------------------------------------------------------
進(jìn)入程序后可以根據(jù)菜單選項(xiàng)進(jìn)入不同的模塊
1.使用首次適應(yīng)算法分配空間
2.使用最佳適應(yīng)算法分配空間
3.釋放一塊空間
4.顯示內(nèi)存分配情況
5.退出系統(tǒng)
----------------------------------------------------------**/
#include stdio.h
#include stdlib.h
#include string.h
#include conio.h
#define MEMSIZE 100 /*定義內(nèi)存大小為100*/
#define MINSIZE 2 /*如果小于此值 將不再分割內(nèi)存*/
typedef struct _MemoryInfomation{/* 內(nèi)存空間分區(qū)表 結(jié)構(gòu)*/
int start; /*起始地址*/
int size; /*大小*/
char info; /*狀態(tài) F:空閑(Free) U:占用(Used) E 結(jié)束(end)*/
}MEMINFO;
MEMINFO MemList[MEMSIZE]; //內(nèi)存空間信息表
void Display();
/*--------------------------------------------------------
函數(shù)名:InitALL()
功 能:初始化所有變量
--------------------------------------------------------*/
void InitAll(){
int i;
MEMINFO temp={0,0,'e'};
for(i=0;iMEMSIZE;i++) //初始化空間信息表
MemList[i]=temp;
MemList[0].start=0; //起始地址為0
MemList[0].size=MEMSIZE;//空間初始為最大的
MemList[0].info='f'; //狀態(tài)為空閑
}
/*--------------------------------------------------------
函數(shù)名:FirstFit_new()
功 能:首次適應(yīng)算法分配內(nèi)存
--------------------------------------------------------*/
void FirstFit_new(){
int i,j,size;
char temp[10];
printf("FirstFit_new:How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字符串轉(zhuǎn)化為整數(shù)
for(i=0; i MEMSIZE-1 MemList[i].info != 'e';i++) //到了空間尾且沒有空間分配
{
if(MemList[i].size = size MemList[i].info=='f') //滿足所需要的大小,且是空閑空間
{
if(MemList[i].size - size = MINSIZE) //如果小于規(guī)定的最小差則將整個(gè)空間分配出去
MemList[i].info='u'; //標(biāo)志為使用
else
{
for(j = MEMSIZE-2; j i; j--) //將i后的信息表元素后移
{
MemList[j+1]=MemList[j];
}
//將i分成兩部分,使用低地址部分
MemList[i+1].start= MemList[i].start+size;
MemList[i+1].size = MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
break;
}
}
if(i == MEMSIZE-1 || MemList[i].info=='e') //沒有找到符合分配的空間
{
printf("Not Enough Memory!!\n");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數(shù)名:BestFit_new()
功 能:最佳適應(yīng)算法分配內(nèi)存
--------------------------------------------------------*/
void BestFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BestFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp); //將字符串轉(zhuǎn)化為整數(shù)
j=0;
flag=0; //標(biāo)志是否有合適的空間分配,0無,1有
k=MEMSIZE; //用來保存滿足要求的最小空間
for(i=0;iMEMSIZE-1 MemList[i].info!='e';i++)
{
if(MemList[i].size = size MemList[i].info == 'f') //符合要求
{
flag=1;
if(MemList[i].size k) //比符合要求的最小空間小,則交換
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag == 0) //沒找到
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size - size = MINSIZE) //小于規(guī)定的最小差,將整個(gè)空間分配
MemList[i].info='u';
else
{
for(j = MEMSIZE-2; j i; j--) //后移
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
最壞適應(yīng)算法
*/
void BadFit_new()
{
int i,j,k,flag,size;
char temp[10];
printf("BadFit_new How many MEMORY requir?");
gets(temp);
size=atoi(temp);
j=0;
flag=0;
k=0; //保存滿足要求的最大空間
for(i=0;iMEMSIZE-1MemList[i].info!='e';i++)
{
if(MemList[i].size=sizeMemList[i].info=='f')
{
flag=1;
if(MemList[i].sizek)
{
k=MemList[i].size;
j=i;
}
}
}
i=j;
if(flag=0)
{
printf("Not Enough Memory!\n");
getch();
j=i;
}
else if(MemList[i].size-size=MINSIZE)
MemList[i].info='u';
else
{
for(j=MEMSIZE-2;ji;j--)
MemList[j+1]=MemList[j];
MemList[i+1].start=MemList[i].start+size;
MemList[i+1].size=MemList[i].size-size;
MemList[i+1].info='f';
MemList[i].size=size;
MemList[i].info='u';
}
Display();
}
/*--------------------------------------------------------
函數(shù)名:del()
功 能:釋放一塊內(nèi)存
--------------------------------------------------------*/
void del()
{
int i,number;
char temp[10];
printf("\nplease input the NUMBER you want stop:");
gets(temp);
number=atoi(temp);
if(MemList[number].info == 'u') //輸入的空間是使用的
{
MemList[number].info = 'f'; //標(biāo)志為空閑
if(MemList[number+1].info == 'f') //右空間為空則合并
{
MemList[number].size+=MemList[number+1].size; //大小合并
for(i=number+1;i MEMSIZE-1 MemList[i].info !='e';i++)/* i后的空間信息表元素前移 */
if(i0)
MemList[i]=MemList[i+1];
}
if(number 0 MemList[number-1].info=='f') //左空間空閑則合并
{
MemList[number-1].size+=MemList[number].size;
for(i=number;iMEMSIZE-1MemList[i].info!='e';i++)
MemList[i]=MemList[i+1];
}
}
else
{
printf("Thist Number is Not exist or is Not used!\n ");
getchar();
}
Display();
}
/*--------------------------------------------------------
函數(shù)名:Display()
功 能:顯示內(nèi)存狀態(tài)
--------------------------------------------------------*/
void Display(){
int i,
used=0; //記錄可以使用的總空間量
/* clrscr();*/
printf("\n----------------------------------------------\n");
printf("%5s%15s%15s","Number","start","size","Info");
printf("\n----------------------------------------------\n");
for(i=0;i MEMSIZE MemList[i].info != 'e';i++)
{
if(MemList[i].info == 'u')
used+=MemList[i].size;
printf("%5d%15d%15d%15s\n",i,MemList[i].start,MemList[i].size,MemList[i].info=='u'?"USED":"FREE");
}
printf("\n----------------------------------------------\n");
printf("Totalsize:%-10d Used:%-10d Free:%-10d\n",MEMSIZE,used,MEMSIZE-used);
printf("\n\n Press Any Key to return...");
getch();
}
/*--------------------------------------------------------
函數(shù)名:main()
功 能:主函數(shù)
--------------------------------------------------------*/
void main(){
char ch;
InitAll();
while(1){
printf("========================================================\n");
printf(" 1.Get a block use the FISTFIT method\n");
printf(" 2.Get a block use the BESTFIT method\n");
printf(" 3.Get a block use the BadFIT method\n");
printf(" 4.Free a block\n");
printf(" 5.Display Mem info \n");
printf(" 6.Exit \n");
printf("========================================================\n");
ch=getch();
switch(ch){
case '1':FirstFit_new();break; //首次適應(yīng)算法
case '2':BestFit_new();break; //最佳適應(yīng)算法
case '3':BadFit_new();break; //最壞適應(yīng)算法
case '4':del();break; //刪除已經(jīng)使用完畢的空間
case '5':Display();break; //顯示內(nèi)存分配情況
case '6':exit(0);
}
}
}
取個(gè)例子,L是一條鏈子,剛開始L-first是鏈頭,你反轉(zhuǎn)鏈子的過程就是把一節(jié)鏈環(huán)拆下來,再接在L的頭部
q=p-next就是把q拆下來,;p-next=q-next就是把被拆成兩部分的鏈子連在一起;q-next=L-first把q接在L的頭部,L-fist=q就是把L的頭部改為q
本文標(biāo)題:c語言fist函數(shù) c語言上fib函數(shù)
文章地址:http://aaarwkj.com/article18/docpcgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營銷、虛擬主機(jī)、營銷型網(wǎng)站建設(shè)、面包屑導(dǎo)航、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)