1. 程式人生 > >資料結構基礎篇-------2. 單鏈表的建立及運算

資料結構基礎篇-------2. 單鏈表的建立及運算

/*
 * 單鏈表的建立及其運算
 * 2018.10.23
 * @L.F
 *
 * */

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef int DataType_t;//結點的資料型別為DataType_t,這裡是Int型

typedef struct Node    //結點型別的定義
{
	DataType_t Data;   //結點的資料域型別
	struct Node *Next; //結點的指標域型別
}LinkList;

LinkList *LinkListCreate() //建立一個空的連結串列
{
	LinkList *h = (LinkList *)malloc(sizeof(LinkList)); //建立一個頭結點
	h->Next = NULL; //初始化結構體
	return h;
}

void LinkListInsertHead(LinkList *h, DataType_t Value)//頭插法插入資料
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申請空間並賦值
	Temp->Data = Value;
	Temp->Next = h->Next;//將頭結點的下一個結點的地址儲存在新插入結點的指標域裡面
	h->Next = Temp;//將新插入的結點的地址儲存在頭結點的指標域裡面
	return ;
}

void LinkListInsertTail(LinkList *h, DataType_t Value)//尾插法插入資料
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申請空間並賦值
	Temp->Data = Value;
	while(h->Next != NULL)//找到最後一個結點
	{
		h = h->Next;
	}
	Temp->Next = NULL;
	h->Next = Temp;
	return ;
}

void LinkListInsertPos(LinkList *h, int pos, DataType_t Value)//按照位置插入資料
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	int i =1;
	while(h->Next != NULL && i<= pos)
	{
		h = h->Next;
		i++;
	}
	if(h->Next == NULL)
	{
		printf("位置出錯\n");
	}
	else
	{
		Temp->Next = h->Next;
		h->Next = Temp;
	}
	return ;
}

void LinkListInsertSort(LinkList *h, DataType_t Value)//按照順序插入(自帶排序功能)
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	while(h->Next != NULL && h->Next->Data < Temp->Data)
	{
		h = h->Next;
	}
	Temp->Next = h->Next;
	h->Next = Temp;
	return ;
}

DataType_t LinkListDeleteHead(LinkList *h)//頭刪法刪除資料
{
	/*h->Next = h->Next->Next;//只刪除*/
	/*
	 * DataType_t Value;
	 * Value = h->Next->Data;
	 * h->Next = h->Next->Next;
	 * */
	/*釋放刪除結點*/
	DataType_t Value;
	LinkList *Temp = h->Next;
	Value = h->Next->Data;
	h->Next = h->Next->Next;
	free(Temp);
	Temp = NULL;
	return Value;
}

int LinkListUpdata(LinkList *h, DataType_t OldValue, DataType_t NewValue)//按照資料修改資料
{
	while(h->Next != NULL)
	{
		if(h->Next->Data == OldValue)
		{
			h->Next->Data = NewValue;
			return 0;
		}
		h = h->Next;
	}
	printf("%d 是不存在的", NewValue);
	return -1;
}

int LinkListSearch(LinkList *h,DataType_t Value)//按照資料查詢位置
{
	int pos = 0;
	while(h->Next != NULL)
	{
		if(h->Next->Data == Value)
		{
			return pos;
		}
		h = h->Next;
		pos++;
	}
	printf("%d 不存在\n", Value);
	return -1;
}

void LinkListReverse(LinkList *h)//實現連結串列的翻轉
{
	LinkList *p = h->Next;
	LinkList *q;
	h->Next = NULL;
	while(p != NULL)
	{
		q = p;
		p = p->Next;
		q->Next = h->Next;
		h->Next = q;
	}
	return ;
}

void LinkListShow(LinkList *h)//列印資料
{
	while(h->Next != NULL)
	{
		h = h->Next;
		printf("             %d", h->Data);
	}
	putchar(10);
}
int main(int argc, const char *argv[])
{
	LinkList *h = LinkListCreate();
	int F,s,i,a,n;
	while(1)
	{
	printf("請輸入您的需求:      1.頭插法插入資料        2.尾插法插入資料        3.按照位置插入資料\n");
	printf("                      4.按照順序插入資料      5.頭刪法刪除資料        6.按照資料修改資料\n");
	printf("                      7.按照資料查詢位置      8.實現連結串列的翻轉\n");
	scanf("%d", &F);
		switch(F)
		{
		case 1:
			printf("請輸入您要插入的資料個數:");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("請輸入您要插入的資料:");
				scanf("%d", &a);
				LinkListInsertHead(h,a);
			}
			LinkListShow(h);
			break;
		case 2:
			printf("請輸入您要插入的資料個數:");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("請輸入您要插入的資料:");
				scanf("%d", &a);
				LinkListInsertTail(h,a);
			}
			LinkListShow(h);
			break;
		case 3:
			printf("請輸入您要插入資料的位置: ");
			scanf("%d", &n);
			printf("請輸入您要插入的資料: ");
			scanf("%d", &a);
    	    LinkListInsertPos(h, n, a);
			LinkListShow(h);
			break;
		case 4:
			printf("請輸入要插入的資料個數: ");
			scanf("%d",&s);
			for(i=0; i<s;i++)
			{
				printf("請輸入要插入的資料:");
				scanf("%d", &a);
				LinkListInsertSort(h, a);
			}
			LinkListShow(h);
			break;
		case 5:
            LinkListDeleteHead(h);
			LinkListShow(h);
			break;
		case 6:
			printf("請輸入需要修改的資料:");
			scanf("%d", &a);
			printf("請輸入修改為的資料: ");
			scanf("%d", &n);
		    LinkListUpdata(h, a, n);
			LinkListShow(h);
			break;
		case 7:
			printf("請輸入您要查詢位置的資料: ");
			scanf("%d",&a);
			printf("所查資料的位置為%d \n", LinkListSearch(h,a));
			break;
		case 8:
			LinkListShow(h);
			LinkListReverse(h);
			LinkListShow(h);
			break;
		default:
			break;
		}
	}
	return 0;
}