简单链表模板

简单链表模板


简单链表(vs)
头文件:

#ifndef   SIMPLELINK 
#define _CRT_SECURE_NO_WARNINGS
#define   SIMPLELINK
#define   DEBUG	
#define   TEST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct NODE
{
	char name[10];
	int age;
	struct NODE * next;
}node;

//创建有n个节点的链表
node* createLink(int n);

int count;

//输出链表--返回值是当前节点数
int printLink(node* head);

//查找数据--返回值是name这条数据条目的总个数
int findLink(node* head, char* name);

//修改数据
void changeLink(node* head, int  n);

//删除数据
node* delLink(node*head,char *name);

//新增数据--按姓名有序
node* insertLink(node* head, node* new);

//释放
void freeLink(node* head);


#endif

源文件:

#include "simpleLink.h"

//创建有n个节点的链表
node* createLink(int n)
{
	int i = 0;
	node* head = NULL;
	node* newNode = NULL;
	node* temp = NULL;
	 
	if (n <= 0)
	{
		printf("节点个数至少为1的正数\n");
		return head;
	}

	for (i = 0; i < n; i++)
	{
		newNode = (node*)malloc(sizeof(node));
		printf("姓名:");
		scanf("%s", newNode->name);
		printf("年龄:");
		scanf("%d",& (newNode->age));
		newNode->next = NULL;

		if (head == NULL)
		{
			head = newNode;
		}
		else
		{
			temp->next = newNode;
		}
		temp = newNode;
	}
	
	count = i;
	printf("成功创建了%d个节点\n",i);
	return head;	 
}


//输出链表
int printLink(node* head)
{
	int i=0;
	if (head == NULL)
	{
		printf("空链表\n");
		return 0;
	}
	node* temp = head;
	while (temp != NULL)
	{
		i++;
		printf("%d\t%-10s %-4d\n",i,temp->name,temp->age);
		temp = temp->next;
	}
	return i;
}

//查找数据
int findLink(node* head, char* name)
{
	int i = 0;
	if (head == NULL)
	{
		printf("空链表,无数据可供查找\n");
		return 0;
	}
	node* temp = head;
	while (temp != NULL)
	{
		if (strcmp(temp->name, name) == 0)
		{
			printf("%-10s %-4d\n", temp->name, temp->age);
			i++;
		}
		temp = temp->next;
	}
 
	return i;
}

//修改数据
void changeLink(node* head, int  n)
{
	node* temp;
	char name[10];
	int i=0, age;
	if (head == NULL)
	{
		printf("空链表,无数据可供修改\n");
		return 0;
	}
	if (n < 0 || n>count)
	{
		printf("没有第%d节点,可用范围是:%d--%d\n",n,1,count);
		return 0;
	}
	temp = head;
	while (temp!=NULL)
	{
		i++;
		if (n == i)
		{
			printf("姓名:");
			scanf("%s", name);
			printf("年龄:");
			scanf("%d", &age);
			strcpy(temp->name, name);
			temp->age = age;
		}
		temp = temp->next;
	}
}


//删除数据
node* delLink(node* head, char* name)
{
	node* temp = NULL;
	node* currentNode = NULL;
	int i = 0;
	if (head == NULL)
	{
		printf("空链表,无数据可供删除\n");
		return head;
	}
	currentNode = head;
	while (currentNode != NULL)
	{
		if (strcmp(currentNode->name, name) == 0)
		{
			i = 1;
			break;
		}
		temp = currentNode;
		currentNode = currentNode->next;
	}

	if (i == 1)
	{
		if (temp == NULL)
		{
			printf("删除首节点\n");
			head=currentNode->next;
		 }
		else
		{
			temp->next=currentNode->next;
		}
		free(currentNode);
	}
	else
	{
		printf("查无此人\n");
	}


	return head;
}

//新增数据--按姓名有序
node* insertLink(node* head, node* new)
{
	node* temp = NULL;
	node* currentNode = NULL;
	int flag = 0;

	if (new == NULL)
	{
		printf("空数据不能进行插入操作\n");
		return head;
	}

	if (head == NULL)
	{
		printf("空链表,新增数据\n");
		head = new;
		new->next = NULL;
		count++;
		return head;
	}

	currentNode=head;

	while ( currentNode != NULL )
	{
		if ( strcmp(new->name, currentNode->name) < 0 )
		{
			
			flag = 1;
			if (temp == NULL)
			{
				printf("确定首位置位置新增数据\n");
				head=new;
				//new->next= currentNode;
				//return head;
			}
			else
			{
				printf("确定中间位置新增数据\n");
				temp->next = new;
				//new->next = currentNode;
				//return head;
			}
			count++;

			new->next= currentNode;

			//return head;
			//讲解过程中有一点疏忽,查找到位置插入数据后就应该跳出循环返回,缺了语句break造成了错误,所以可以用break代替return.
			break;
			
		}
		temp = currentNode;
		currentNode = currentNode->next;
	}
	if (flag==0)
	{
		printf("确定尾部新增数据\n");
		count++;
		temp->next=new;
		new->next = NULL;
	}
	printf("count=%d\n",count);
	return head;
}


//释放
void freeLink(node* head)
{
	if (head == NULL)
	{
		return;
	}
	free(head);
}

源文件:

#include "simpleLink.h"
int main()
{
	node* head = NULL;
	
	int n;
	//printf("输入个数\n");
	//scanf("%d",&n);

	//head = createLink(n);
	//printLink(head);

	//printf("节点数:%d\n",printLink(head));

	//findLink(head, "aaaa");

	//changeLink(head, 2);

	//printLink(head);

	//head=delLink(head, "aaaa");
	//printLink(head);


	//head=delLink(head, "pppp");
	//printLink(head);

	//head=delLink(head, "cccc");
	//printLink(head);
	

	node n1 = { "eeee",23,NULL };	
	node n2 = { "aaaa",23,NULL };
	node n3 = { "tttttt",23,NULL };	 
	node n4 = { "fffff",23,NULL };
	node n5 = { "wwwww",23,NULL };
	node n6 = { "vvvv",23,NULL };
	node n7 = { "aa",23,NULL };
	node n8 = { "zzz",23,NULL };
	node n9 = { "yy",23,NULL };

	//printf("1=%d\n",&n1);
	//printf("2=%d\n", &n2);
	//printf("3=%d\n", &n3);
	//printf("4=%d\n", &n4);
	//printf("5=%d\n", &n5);
	//printf("6=%d\n", &n6);
	//printf("7=%d\n", &n7);

	head = insertLink(head, &n1);
	head = insertLink(head, &n2);
	head = insertLink(head, &n3);
 //
	head = insertLink(head, &n4);
	head = insertLink(head, &n5);
	head = insertLink(head, &n6);
	head = insertLink(head, &n7);
	head = insertLink(head, &n8);
	head = insertLink(head, &n9);

	printf("count=%d\n",printLink(head));



	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值