简单链表模板
简单链表(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;
}