数据结构是任何一个语言的基础,下面就讲解一下C语言的数据结构--单向链表。
首先我们需要定义一个链表:
struct Test {
int data;
struct Test *next;
};
链表就是定义一个结构体,结构体中有一个链表指针,这个链表指针指向别的链表就形成了一个链,这就是链表,链表分单向和双向,本节主要将的是单向链表。
链表的创建:
struct Test* insertFromBehind(struct Test* head,struct Test* new)//尾插法
{
struct Test* point;
point = head;
if(head == NULL)
{
head = new;
return head;
}
while(point->next != NULL)//移动到尾巴
{
point = point->next;
}
point->next = new;//最后一个节点next指针指向新节点
return head;
}
struct Test* insertFromhead(struct Test* head,struct Test* new)//头插法
{
if(head == NULL)//如果链表没有节点时直接赋值
{
head = new;
}else
{
new->next = head;//新节点的next指针指向头节点
head = new;//头节点等于新节点
}
return head;
}
上面是链表创建是头插法和尾插法,在实际应用是我们需要,进行连续的插入,因此需要再写一个函数去调用头插和尾插,实现连续插入。
struct Test* insertLinkHead(struct Test* head)
{
struct Test* new = NULL;
while(1)
{
new = (struct Test*)malloc(sizeof(struct Test));
new->next = NULL;
printf("please input your data:\n");
scanf("%d"&(new->data));
if(new->data == 0)
{
printf("quit\n");
free(new);
return head;
}else
{
head = insertFromBehind(head,new);
}
}
}
链表的遍历:
void printLink(struct Test* head)//链表的遍历
{
struct Test* point = head;
while(point != NULL)
{
printf("%d ",point->data);
point = point->next;
}
printf("\n");
}
链表节点数量:
int LinkNum(struct Test* head)//链表节点数量
{
static int num = 0;
struct Test* point = head;
while(point != NULL)
{
num ++;
point = point->next;
}
return num;
}
改变链表节点的值:
int changLink(struct Test* head,int num)//更改链表节点
{
struct Test* point = head;
int chang_num;
while(point != NULL)
{
if(point->data == num)
{
printf("please input your data:\n");
scanf("%d",&chang_num);
point->data = chang_num;
return 1;
}
point = point->next;
}
return 0;
}
检查某个节点是否存在:
int isExist(struct Test* head,int num)//查询节点是否存在
{
struct Test* point = head;
while(point != NULL)
{
if(point->data == num)
{
return 1;
}
point = point->next;
}
return 0;
}
在某个节点后方插入新节点:
int insertLinkNumBehind(struct Test* head,int num,struct Test* new)//在某个节点后面插入一个新节点
{
struct Test* point = head;
while(point != NULL)
{
if(point->data == num)//找到节点
{
new->next = point->next;//新节点的next指针指向此节点的下一个
point->next = new;//此节点的下一个是new
return 1;
}
point = point->next;
}
return 0;
}
在某个节点的前方插入新节点:
struct Test* insertLinkNumFront(struct Test* head,int num,struct Test *new)//在某个节点的前方插入新节点
{
struct Test* point = head;
if(head->data == num)
{
new->next = head;
return new;
}
while(point != NULL)
{
if(point->next->data == num)
{
new->next = point->next;
point->next = new;
return head;
}
point = point->next;
}
return head;
}
删除某个节点:
struct Test* delectNum(struct Test* head,int data)//删除某个节点
{
struct Test* point = head;
if(point->data == data)
{
head = head->next;
return head;
}
while(point != NULL)
{
if(point->next->data == data)
{
point->next = point->next->next;
return head;
}
point = point->next;
}
return head;
}
总代码:
#include <stdio.h>
#include <stdlib.h>
struct Test
{
int data;
struct Test *next;
};
struct Test* insertFromBehind(struct Test* head,struct Test* new)//尾插法
{
struct Test* point;
point = head;
if(head == NULL)
{
head = new;
return head;
}
while(point->next != NULL)//移动到尾巴
{
point = point->next;
}
point->next = new;//最后一个节点next指针指向新节点
return head;
}
struct Test* insertFromhead(struct Test* head,struct Test* new)//头插法
{
if(head == NULL)//如果链表没有节点时直接赋值
{
head = new;
}else
{
new->next = head;//新节点的next指针指向头节点
head = new;//头节点等于新节点
}
return head;
}
struct Test* insertLinkHead(struct Test* head)
{
struct Test* new = NULL;
while(1)
{
new = (struct Test*)malloc(sizeof(struct Test));
new->next = NULL;
printf("please input your data:\n");
scanf("%d",&(new->data));
if(new->data == 0)
{
printf("quit\n");
free(new);
return head;
}else
{
head = insertFromBehind(head,new);
}
}
}
void printLink(struct Test* head) //链表的遍历
{
struct Test* point = head;
while(point != NULL)
{
printf("%d ",point->data);
point = point->next;
}
printf("\n");
}
int LinkNum(struct Test* head)//链表节点数量
{
static int num = 0;
struct Test* point = head;
while(point != NULL)
{
num ++;
point = point->next;
}
return num;
}
int changLink(struct Test* head,int num)//更改链表节点
{
struct Test* point = head;
int chang_num;
while(point != NULL)
{
if(point->data == num)
{
printf("please input your data:\n");
scanf("%d",&chang_num);
point->data = chang_num;
return 1;
}
point = point->next;
}
return 0;
}
int isExist(struct Test* head,int num)//查询节点是否存在
{
struct Test* point = head;
while(point != NULL)
{
if(point->data == num)
{
return 1;
}
point = point->next;
}
return 0;
}
int insertLinkNumBehind(struct Test* head,int num,struct Test* new)//在某个节点后面插入一个新节点
{
struct Test* point = head;
while(point != NULL)
{
if(point->data == num)//找到节点
{
new->next = point->next;//新节点的next指针指向此节点的下一个
point->next = new;//此节点的下一个是new
return 1;
}
point = point->next;
}
return 0;
}
struct Test* insertLinkNumFront(struct Test* head,int num,struct Test *new)//在某个节点的前方插入新节点
{
struct Test* point = head;
if(head->data == num)
{
new->next = head;
return new;
}
while(point != NULL)
{
if(point->next->data == num)
{
new->next = point->next;
point->next = new;
return head;
}
point = point->next;
}
return head;
}
struct Test* delectNum(struct Test* head,int data)//删除某个节点
{
struct Test* point = head;
if(point->data == data)
{
head = head->next;
return head;
}
while(point != NULL)
{
if(point->next->data == data)
{
point->next = point->next->next;
return head;
}
point = point->next;
}
return head;
}
int main()
{
int num = 0;
int isOK = 0;
struct Test* head = NULL;
struct Test new1 = {20,NULL};
struct Test new2 = {30,NULL};
head = insertLinkHead(head);
printLink(head);
num = LinkNum(head);
printf("LinkNumber = %d\r\n",num);
changLink(head,2);
printLink(head);
isOK = isExist(head,2);
if(isOK == 1)printf("number is exist\n");
else printf("number is not exist\n");
insertLinkNumBehind(head,100,&new1);
printLink(head);
head = insertLinkNumFront(head,1,&new2);
printLink(head);
head = delectNum(head,3);
printLink(head);
return 0;
}