链表操作

#include
#include

typedef struct list
{
	int data;
	struct list * next;
}NODE, * pNODE;

pNODE Init_LinkList()				//链表的初始化
{
	int i = 0;
	int val;
	pNODE pHead = (pNODE)malloc(sizeof(NODE));
	if (NULL == pHead)
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
	pNODE pPre = pHead;
	pPre->next = NULL;
	while(1)
	{
		printf("请输入链表中第%d个结点的值,输入0结束输入\n",++i);
		scanf("%d",&val);
		if(0 == val) break;
		else
		{
			pNODE pCurrent = (pNODE)malloc(sizeof(NODE));
			if(NULL == pCurrent){
				printf("内存分配失败!\n");
				exit(-1);
			}
			else 
			{
				pCurrent->data = val;
				pPre->next = pCurrent;
				pCurrent->next = NULL;
				pPre = pCurrent;
			}
		}
	}
	return pHead;
}

bool is_empty(pNODE pHead)				//检查链表是否为空
{
	return NULL == pHead;
}

pNODE Insert_Node(pNODE pHead)				//插入结点
{
	int i;
	int pos,val;
	printf("请输入你想要插入结点的位置:");
	scanf("%d",&pos);
	printf("请输入你想要插入结点的值:");
	scanf("%d",&val);
	if(!is_empty(pHead))
	{
		pNODE p = pHead;
		for(i = 0; i < pos; ++ i){
			p = p->next;
			if(NULL == p)
			{
				printf("该位置不存在结点!\n");
				exit(-1);
			}
		}
		pNODE New_Node = (pNODE)malloc(sizeof(NODE));
		if(NULL == New_Node){
			printf("内存分配失败!\n");
			exit(-1);
		}
		else
		{
			New_Node->next = p->next;
			New_Node->data = val;
			p->next = New_Node;
		}
		return pHead;
	}
	else
	{
		printf("链表为空!\n");
		exit(-1);
	}
}

pNODE Delete_Node(pNODE pHead)			//删除结点
{
	int i;
	int pos,val;
	if(is_empty(pHead))
	{
		printf("该链表为空!\n");
		exit(-1);
	}
	printf("请输入你想要删除结点的位置:");
	scanf("%d",&pos);
	pNODE p = pHead;
	for(i = 0; i < pos; ++ i){
		p = p->next;
		if(NULL == p)
		{
			printf("该位置不存在结点!\n");
			exit(-1);
		}
	}
	pNODE front = p->next->next;
	pNODE rear = p->next;
	p->next = front;
	val = rear->data;
	free(rear);
	rear->next = NULL;
	printf("删除成功,该结点的值为%d\n",val);
	return pHead;
}

void Search_Node(pNODE pHead)				//搜索结点
{
	int val,pos=0;
	printf("请输入你想要查找的数据:");
	scanf("%d",&val);
	pNODE p = pHead;
	if(is_empty(pHead))
	{
		printf("该链表为空!\n");
		exit(-1);
	}
	while(NULL != p->next)
	{
		p = p->next;
		pos++;
		if(val == p->data)
		{
			printf("该数据所在结点的位置为%d\n",pos);
			return;
		}
	}
	printf("该数据不存在于链表中!\n");
}

void Traverse_List(pNODE pHead)			//链表遍历
{
	pNODE p = pHead;
	if(NULL == pHead)
	{
		printf("该链表为空!\n");
		return;
	}
	else
		printf("输出的链表为:\n");
	while(NULL != p->next)
	{
		p = p->next;
		printf("%d ",p->data);
	}
	printf("\n");
}

void Clear_LinkList(pNODE & pHead)			//清空链表
{
	while(NULL != pHead){
		pNODE p = pHead;
		pHead = pHead->next;
		free(p);
		p->next = NULL;
	}
}

int Length_of_List(pNODE pHead)			//链表长度
{
	int len = 0 ;
	pNODE p = pHead;
	while(NULL != p)
	{
		p = p->next;
		len++;
	}
//	printf("该链表的长度为%d\n",len - 1);
	return len - 1;
}

void Sort_LinkList(pNODE & pHead)			//链表排序
{
	int i,j,temp;
	int len = Length_of_List(pHead);
	pNODE p,q;
	for (i = 0,p = pHead->next; i < len - 1; ++i, p = p->next)
	{
		for(j = i+1,q = p->next; j < len; ++ j, q = q->next)
		{
			if (p->data > q->data)
			{
				temp = q->data;
				q->data = p->data;
				p->data = temp;
			}
		}
	}
}

int main()
{
	pNODE pHead = Init_LinkList();
	Traverse_List(pHead);
//	pHead = Insert_Node(pHead);
//	Traverse_List(pHead);
//	pHead =  Delete_Node(pHead);
//	Traverse_List(pHead);
//	Search_Node(pHead);
//	Clear_LinkList(pHead);
//	Traverse_List(pHead);
//	int len = Length_of_List(pHead);
	Sort_LinkList(pHead);
	Traverse_List(pHead);
	return 0;
}

你可能感兴趣的:(DS)