C語言數據結構——單鏈表

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="white-space:pre">	</span>數據結構的一些講解,供學習者參考,也順帶作爲複習     </span>
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">        鏈表與順序表不同,它是一種動態的存儲結構,鏈表中每個結點佔用的存儲空間不是預先分配的,而是運行時系統根據需求生成的,因此建立單鏈表從空表開始,每讀入一個數據元素則申請一個結點,然後插在鏈表的頭部。下圖爲鏈表的構建過程,因爲是在鏈表的頭部插入,讀入數據的順序表和線性表的邏輯順序是相反的。</span>


鏈表建立

LinkList Creat_LinkList()
{
	LNode *s;
	int x;
	printf("請輸入數據(輸入'0'表結束輸入):\t");
	scanf("%d",&x);
	while(x!=0)
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=L;
		L=s;
		printf("請輸入數據(輸入'0'表結束輸入):\t");
		scanf("%d",&x);

	}
	return L;
}

獲取某個位置的數據

LNode *Get_LinkList(LinkList L,int i)
{
	LNode *p=L;
	int j=0;
	while(p->next!=NULL&&j<i)
	{
		p=p->next;
		j++;
	}
	if(j==i)
		return p;
	else 
		return NULL;
}

定位到某個元素的結點

LNode *Locate_LinkList(LinkList L,int x)
{
	LNode *p=L->next;
	while(p!=NULL&&p->data!=x)
		p=p->next;
	return p;
}

插入算法1,i爲插入的位置,x爲插入的元素

int Insert_LinkList_1(LinkList L,int i,int x)
{
	LNode *p,*s;
	p=Get_LinkList(L,i-1);
	if(p==NULL)
	{
		printf("參數i錯誤\n");
		return 0;
	}
	else 
	{
		s=(LNode *)malloc(sizeof(LNode));
		s->data=x;
		s->next=p->next;
		p->next=s;
		return 1;
	}
}

插入算法2:表頭插入

LinkList Insert_LinkList_2(LinkList L,int x)
{
	LNode *s;
	s=(LNode *)malloc(sizeof(LNode));
	s->data=x;
	s->next=L;
	L=s;
	return L;
}

刪除鏈表某個位置的元素
int Del_LinkList(LinkList L,int i)
{
	LinkList p,s;
	p=Get_LinkList(L,i-1);
	if(p==NULL)
	{
		printf("第i-1個結點不存在\n");
		return -1;
	}
	else if(p->next==NULL)
	{
		printf("第i個結點不存在\n");
		return 0;
	}
	else
	{
		s=p->next;
		p->next=s->next;
		free(s);
		return 1;
	}
}

計算鏈表的長度

int Length_LinkList(LinkList L)
{
	LNode *p=L;
	int j=0;
	while(p)
	{
		p=p->next;
		j++;
	}
	return j;
}

輸出鏈表內的所有元素

void OutputList(LinkList L)
{
	LNode *p=L;
	while(p)
	{
		printf("%4d",p->data);
		p=p->next;
	}
}

主函數設計

void main()
{
	LinkList H=NULL;
	int item,model,addr;
	while(1)
	{
		printf("請選擇操作:\n【1】創建鏈表\n【2】特定位置插入數據\n【3】表頭插入數據\n【4】特定元素刪除\n【5】表長度\n【6】查看鏈表\n【7】退出\n");
		printf("請輸入:\t");
		scanf("%d",&model);
		fflush(stdin);
		switch(model)
		{
		case 1:
			H = Creat_LinkList();
			OutputList(H);
			break;
		case 2:
			while(1)
			{
				printf("請輸入插入的位置\t");
				scanf("%d",&addr);
				if(addr==0)
					break;
				printf("請輸入插入的數據\t");
				scanf("%d",&item);
				Insert_LinkList_1(H,addr,item);
			}
			OutputList(H);
			break;
		case 3:
			while(1)
			{
				printf("請輸入插入的數據\t");
				scanf("%d",&item);
				if(item==0)
					break;
				H=Insert_LinkList_2(H,item);
			}
			OutputList(H);
			break;
		case 4:
			while(1)
			{
				printf("請插入刪除的位置\t");
				scanf("%d",&addr);
				if(addr==0)
					break;
				Del_LinkList(H,addr);
			}
			OutputList(H);
			break;
		case 5:
			printf("%d\n",Length_LinkList(H));
			break;
		case 6:
			OutputList(H);
			printf("\n");
			break;
		case 7:
			exit(0);
		default:
			printf("輸入有誤,請重新輸入\n");

		}
	}
}


運行程序圖



需要源代碼的歡迎下載,免積分,共同學習,家下來每天都會分享一篇,持續一個星期

http://download.csdn.net/detail/kevin_iot/9395889


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章