C语言链表的增删改查,以及链表节点的排序问题

链表的增删改查,这儿加了链表节点的排序问题,希望对初学者有帮助。
代码如下:

#include "pch.h"
#include 
#include
  //链表的增删改查
typedef int DATA;
struct LinkList
{
	DATA data;
	LinkList* next;
};
LinkList* pHead = NULL;
  //建立链表,添加节点
void Append(DATA data)
{
	LinkList* p1 = pHead;
	LinkList* news = (LinkList*)malloc(sizeof(LinkList));
	if (news != NULL)
	{
		news->data =data;
		news->next = pHead;
		pHead = news;
	}
	else
	{
		printf("没有申请成功!");
	}
}
  //记录链表长度,如果没有特殊要求可以不必记录链表长度
int listLen()
{
	int nlength = 0;
	LinkList* p = pHead;
	while (p)
	{
		nlength++;
		p = p->next;
	}
	return nlength;
}
  //在链表中插入节点
int InsertNode(DATA data, DATA data1)//InsertNode(插入的位置,要插入的数据)
{	
	LinkList* p = pHead;
	while (p)
	{
		if (p->data == data)
		{
			LinkList* newsNode = (LinkList*)malloc(sizeof(LinkList));
			newsNode->data = data1;
			newsNode->next = p->next;
			p->next = newsNode;
			return 1;
		}
		p = p->next;
	}
	return 0;
}	

   //删除节点
int deleteNode(int data)
{
	LinkList* p = pHead;
	LinkList* p1 = NULL;
	if (pHead->data== data)
	{
		pHead = pHead->next;
		free(p);
		return 1;
	}
	while (p)
	{	
		if (p->data == data)
		{
			p1->next = p->next;
			free(p);
			return 1;
		}
		p1 = p;//保留节点
		p = p->next;//下一个节点
	}
	return 0;
}
  //修改节点里的值
int modify(DATA data, DATA ndata)//modify(源数据,要赋值的数据)
{
	LinkList* p = pHead;
	while(p)
	{
		if (p->data==data)
		{
			p->data = ndata;
			return 1;
		}
		p = p->next;
	}
	return 0;
}
  //查询节点,指定数据查找
int contentNode(DATA data)
{
	LinkList* p = pHead;
	while (p)
	{
		if (p->data==data)
		{
			printf("位置在:%p 值为:%d", p, p->data);
			return 1;
		}
		p = p->next;
	}
	return 0;
}

  //对链表节点里的值,在这儿就是数字,进行从小到大排序。可能不太好理解,可以用印象笔记圈点画图分析,只要理解p1和p2的指针指向的变化,就能理解这个排序
void orderBy()
{
	LinkList* p = pHead;	
	while (p)
	{
		LinkList* p1 = p->next;
		LinkList* p2 = p;	
		while (p1)
		{	
			if (p2->data > p1->data)
			{
				p2 = p1;
			}
			p1 = p1->next;
		}					
		if (p2!=p)
		{
			DATA temp = p->data;
			p->data = p2->data;
			p2->data = temp;
		}
		p = p->next;
	}
}

  //打印链表信息
void Print()
{
	LinkList* p = pHead;
	while (p)
	{		
		printf("\n链表的值:%d 地址:%p 下一个地址:%p\n", p->data, p,p->next);
		p=p->next;
	}	
}
int main()
{
	Append(5);
	Append(4);
	Append(3);
	Append(2);
	Append(1);
	Append(33);
	Append(49);

	//修改前
	Print();

	//修改后
	//modify(33,500);
	//Print();
	//printf("链表的长度 %d\n",listLen());	
	InsertNode(33, 1000);//插入一个节点
	//deleteNode(33);//删除一个节点
	//contentNode(33);//查询数据
	Print();	
	system("pause");
}

你可能感兴趣的:(C语言)