链表的创建、插入、删除、排序和逆置

链表的结构定义

typedef struct LinkedList
{
	char data;
	LinkedList *next;
}Node;

链表的创建

Node *create(const char *ch)
{
	int len = (int)strlen(ch);
	Node *head, *phead;
	phead = (Node *)malloc(sizeof(Node));
	phead->data = ch[0];
	head = phead;
	for(int i=1; i<len; i++)
	{
		Node *pNode;
		pNode=(Node *)malloc(sizeof(Node));
		pNode->data=ch[i];

		phead->next = pNode;
		phead = phead->next;
	}
	phead->next = NULL;

	return head;
}

Node *create(int len)
{
	Node *head, *phead;
	char ch;
	head = NULL;
	phead = NULL;
	while(len--)
	{
		cin>>ch;
		Node *pNode;
		pNode=(Node *)malloc(sizeof(Node));
		pNode->data=ch;
		if(!phead)
		{
			phead = pNode;
			head = phead;
		}
		else
		{
			phead->next=pNode;
			phead = phead->next;
		}
	}
	phead->next = NULL;

	return head;
}

链表结点的插入

/*结点的插入*/
Node *insert(Node *head, char ch)
{
	Node *phead, *pNode, *preNode;
	phead = head;
	preNode = NULL;
	pNode = (Node *)malloc(sizeof(Node));
	pNode->data = ch;
	while(pNode->data > phead->data && phead->next)
	{
		preNode = phead;
		phead = phead->next;
	}
	if(pNode->data <= phead->data)
	{
		//插入的是头结点
		if(head == phead)				
		{
			pNode->next=phead;
			head = pNode;
		}
		//插入的是中间
		else
		{
			preNode->next = pNode;
			pNode->next = phead;
		}
	}
	//插入的是尾结点
	else
	{
		phead->next = pNode;
		pNode->next = NULL;
	}

	return head;
}
链表结点的删除

/*结点的删除*/
Node *del(Node *head, char ch)
{
	Node *phead, *preNode;
	phead = head;
	preNode = NULL;
	while(phead)
	{
		if(ch == phead->data)
		{
			if(phead == head)
				head=phead->next;
			else
				preNode->next = phead->next;
		}
		preNode = phead;
		phead=phead->next;
	}

	return head;
}

链表结点的排序

int length(Node *head)
{
	int len=0;
	Node *ptr=head;
	while(ptr)
	{
		ptr=ptr->next;
		len++;
	}
	return len;
}

/*链表排序*/
Node *sort(Node *head)
{
	if(!head || !head->next)
		return head;
	Node *phead = head;

	char tmp;
	int len = length(head);
	for(int i=0; i<len; i++)
	{
		phead=head;
		for(int j=0; j<len-i-1; j++)
		{
			if(phead->data > phead->next->data)
			{
				tmp = phead->next->data;
				phead->next->data = phead->data;
				phead->data = tmp;
			}
			phead = phead->next;
		}
	}

	return head;
}

链表结点的逆置

/*链表逆置*/
Node *reverse(Node *head)
{
	Node *phead, *pNode;
	pNode = head;
	phead = NULL;
	while(pNode)
	{
		Node *pNext = pNode->next;
		if(pNext == NULL)
			head = pNode;
		pNode->next = phead;
		phead = pNode;
		pNode = pNext;
	}

	return head;
}

测试用例Code:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <iomanip>
#include <math.h>
#include <vector>

using namespace std;
#define MAXLEN			10001
void printList(Node *head)
{
	Node *phead;
	phead = head;
	while(phead)
	{
		cout<<phead->data<<" ";
		phead=phead->next;
	}
	cout<<endl;

	return ;
}
int main(int argc, char** argv)
{
	bool is_num=true;
	char ch[MAXLEN];
	Node *phead;

	cin>>ch;
	int len = strlen(ch);
	while( len-- && is_num )
	{
		if(!isdigit(ch[len]))
			is_num=false;
	}
	if(is_num)
	{
		cout<<"请输入长度为"<<atoi(ch)<<"的字符链表:"<<endl;
		phead = create(atoi(ch));
	}
	else
		phead = create(ch);
	cout<<"链表创建时的数据"<<endl;
	printList(phead);

	phead = reverse(phead);
	cout<<"链表逆置后的数据"<<endl;
	printList(phead);

	phead = sort(phead);
	cout<<"链表排序后的数据"<<endl;
	printList(phead);

	phead = insert(phead, 'x');
	cout<<"链表插入新数据x后的数据"<<endl;
	printList(phead);

	phead = del(phead, 'x');
	cout<<"链表删除数据x后的数据"<<endl;
	printList(phead);

	phead = del(phead, 'a');
	cout<<"链表删除数据a后的数据"<<endl;
	printList(phead);

	system("pause");
	return 0;
}

 
 


猜你喜欢

转载自blog.csdn.net/winboyer/article/details/48808491
今日推荐