線性表的鏈式結構實現

				/* 6 線性表的鏈式結構實現 */

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

typedef int TYPE;//定義數據類型別名

//聲明結點結構體
typedef struct Node
{
	TYPE data;//存儲結點數據
	struct Node* next;//指向下一節點
}Node;

//聲明鏈表結構體
typedef struct
{
	Node* head;//頭指針
	int length;//鏈表長度
}lineList;

/*對單鏈表的操作*/
bool init(lineList* list);//鏈表初始化

bool input(lineList* list,int pos,TYPE elem);//插入操作

/*因爲使用了c++編譯器,所以在delete後面加了1*/
TYPE delete1(lineList* list,int pos);//刪除操作

int length(lineList* list);//鏈表長度

void traverse(lineList* list);//遍歷操作

int search(lineList* list,TYPE elem);//查詢指定元素的位置

void clear(lineList* list);//鏈表清空

void destroy(lineList* list);//銷燬鏈表

int main()
{
	lineList list;
	//初始化測試
	bool flag=init(&list);
	if(flag)
		printf("初始化成功!\n");
	else
		printf("初始化失敗!\n");
	
	for(int i=0;i<6;i++)	//循環測試6次
	{	
		//插入操作測試
		printf("輸入插入的位置:");
		int pos=0;
		scanf("%d",&pos);
		printf("輸入插入的數值:");
		TYPE elem=0;
		scanf("%d",&elem);
		flag=input(&list,pos,elem);
		if(flag)
			printf("插入成功!\n");
		else
			printf("插入位置不合法,插入失敗!\n");
		
		
		//遍歷操作測試
		printf("遍歷鏈表:");
		traverse(&list);
		//鏈表長度測試
		printf("鏈表的長度爲:%d\n",length(&list));
		
		//搜索鏈表
		printf("輸入要搜素的元素:");
		scanf("%d",&elem);
		pos=search(&list,elem);
		if(pos!=-1)
			printf("元素%d在鏈表的第%d個位置\n",elem,pos);
		else
			printf("不存在,查找失敗!\n");
		
		//刪除操作測試
		printf("輸入要刪除的位置:");
		scanf("%d",&pos);
		elem=delete1(&list,pos);
		if(elem!=-1)
			printf("刪除的元素是:%d\n",elem);
		else
			printf("刪除位置不合法或者鏈表已空,刪除失敗!\n");
		printf("刪除後遍歷鏈表:");
		traverse(&list);
		printf("刪除後鏈表的長度爲:%d\n",length(&list));
	}
	
	//清空鏈表
	clear(&list);
	printf("清空後遍歷鏈表:");
	traverse(&list);
	
	//銷燬鏈表
	destroy(&list);
	return 0;
}

//鏈表初始化
bool init(lineList* list)
{
	Node* p=(Node*)malloc(sizeof(struct Node));
	if(p)
	{
		p->next=NULL;
		list->head=p;
		list->length=0;
		return true;
	}
	else
		return false;
}

//插入操作
bool input(lineList* list,int pos,TYPE elem)
{
	if(pos>0&&pos<=length(list)+1)
	{
		Node* p=(Node*)malloc(sizeof(struct Node));
		if(p)
		{
			p->data=elem;
			Node* q=list->head;
			for(int i=1;i<pos;i++)
			{
				q=q->next;
			}
			p->next=q->next;
			q->next=p;
			list->length++;
			return true;
		}
		else 
			return false;
	}
	else
		return false;
}

//刪除操作
TYPE delete1(lineList* list,int pos)
{
	if(0!=length(list)&&pos>0&&pos<=length(list))
	{
		Node* p=list->head;
		for(int i=1;i<pos;i++)
		{
			p=p->next;
		}
		Node* q=p->next;
		TYPE elem=q->data;
		p->next=p->next->next;
		free(q);
		q=NULL;
		list->length--;
		return elem;
	}
	else
		return -1;//返回-1代表刪除失敗
}

//鏈表長度
int length(lineList* list)
{
	return list->length;
}

//遍歷鏈表
void traverse(lineList* list)
{
	Node* p=list->head->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

//搜索鏈表
int search(lineList* list,TYPE elem)
{
	Node* p=list->head->next;
	int pos=0;
	while(p)
	{
		if(p->data==elem)
		{
			break;
		}
		else
		{
			pos++;
			p=p->next;
		}
	}
	if(pos==length(list))
		return -1;
	else
		return pos+1;
}

//清空鏈表
void clear(lineList* list)
{
	destroy(list);
	init(list);
}

//銷燬鏈表
void destroy(lineList* list)
{
		Node* p=list->head->next;
		while(length(list))
		{
			Node* q=p;
			p=p->next;
			free(q);
			q=NULL;
			list->length--;
		}
		free(list->head);
		list->head=NULL;
}



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