1. 程式人生 > >資料結構(C語言):連結串列,約瑟夫問題

資料結構(C語言):連結串列,約瑟夫問題

開始學習資料結構,把寫過的程式碼發上來,希望可以給有需要的人一個參考。

//本程式碼由 大漠孤煙  整理編寫,並驗證通過  
//求解約瑟夫問題,涉及到連結串列節點的生成,節點的插入和刪除,對理解連結串列非常有好處  
//N個節點圍城一圈,從第一個節點開始計數(1),每數到第M的數刪除,看最後留下那個數  
#include<stdio.h>  
#include<stdlib.h>  
#include<malloc.h>  
  
typedef struct LNode  
{  
    int item;  
    LNode *next;//注意,這裡要用自己的型別宣告一個指標  
}LNode;  
//這個宣告建立了一個連結串列節點的結構體,包括資料域個指標域  
//LNode是一個結構變數,可以用來計算結構體佔用的記憶體  

//宣告一個指向連結串列節點的指標
typedef struct LNode *LinkList;

int main(int argc,char *argv[])//使用引數之後要從dos介面執行並輸入引數
{
	int N,M;
	int i;

	N = atoi(argv[1]);
	M = atoi(argv[2]);

	LinkList Lhead,p,q;//定義三個指向連結串列結構的指標

	        //將malloc()的返回值強制轉換為LinkList型別,不可少
	Lhead = (LinkList)malloc(sizeof(LNode));//為頭結點分配空間
	if(!Lhead)
		return 1;//分配記憶體空間失敗

	Lhead->item = 1;
	Lhead->next = Lhead;
	p = Lhead;     
	for(i = 2; i <= N; i++)
	{
		q = (LinkList)malloc(sizeof(LNode));//重新申請一個節點空間
		if(!q)
			return 1;

		q->next = p->next;
		p->next = q;//插入一個節點

		q->item = i;

		p = q;//這樣下次迴圈的時候節點可以接在本次節點的後面
	}
	//此時q是最後一個節點

	while(q != q->next)//直到指向自己,也就是說剩下一個
	{
		for(i= 1; i < M; i++)
		{
			q = q->next;
			//printf("%d",q->item);
		}
		//printf("  ");

		p = q->next;
		
		printf("刪除節點: %d\n",p->item);
		
		q->next = q->next->next;//刪除一個節點
		N--;
		free(p);//及時釋放記憶體
	}

	printf("最後剩下的節點:%d\n",q->item);
	free(q);

	while(1);
}

最後上傳一個執行結果截圖