今天我们要讲的是链表
定义链表结构体
typedef struct _node
{
int data;//数据域
struct _node *next;//指针域
}Node;//创建结构体
声明函数
Node * make_node(Node* a,int n);//创建链表
Node * add(Node *a);//增添数据
Node * delete(Node *a);//删除数据
void _free(Node*);//释放数据
void _print(Node *a);//打印数据
创建链表(头插法)
Node* make_node(Node* a,int n)//创建一个链表,并且存入数据
{
int i;
Node *head = NULL;//第一步
a = (Node*)malloc(sizeof(Node));//第二步
printf("输入数据:\n");
scanf("%d",& a->data);
a->next = NULL;//第三步 存入数据
head = a;// 第四步
i++;
while(i!= n)
{
a = (Node*)malloc(sizeof(Node));
scanf("%d",&a->data);//第五步
a->next = head;//第六步
head = a;//第七步
i++;
}
return a;
}
添加数据
特殊情况(仅有一个数据的链表)
a=p;
if(p->next==NULL)//仅有一个数据的链表
{
p->next=(Node*)malloc(sizeof(Node));//(1)
p=p->next;
p->next=NULL;
p->data=data;
return a;
}
一般情况
for(;p!=NULL;p=p->next)
{
if(p->data==s)//(1)
{
Node *q;
q=(Node*)malloc(sizeof(Node));
q->data = data;//(2)
q->next = p->next;//(3)
p->next = q;//(4)
return a;
}
}
删除数据
Node * delete(Node *a)
{
int data;
Node *p;
printf("需要删除的数据为:\n");
scanf("%d",&data);
//需要删除的数据在第一个
p=a;//(1)
if(a->data==data)
{
a=a->next;//(2)
free(p);//(3)
return a;
}
//不在
else
{
Node *q=NULL;//(1)
for(;p!=NULL;q=p,p=p->next)
{
if(p->data==data)
{
q->next=p->next;//(2)(3)
free(p);
return a;
}
}
}
}
free 函数
void _free(Node *a)
{
Node *p;
while(a!=NULL)
{
p=a;//(1)
a=a->next;//(2)
free(p);//(3)
}
}
如果有不恰当的部分忘各位大佬指正,多多包涵,谢谢啦
在最后我给出了完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node
{
int data;
struct _node *next;
}Node;//创建结构体
Node * make_node(Node* a,int n);
Node * add(Node *a);//添加数据
Node * delete(Node *a);
void _free(Node*);
void _print(Node *a);
int main()
{
Node *a;
int n;//创建一个长度为n的链表
printf("创建一个多长的链表:\n");
scanf("%d",&n);
printf("创建:\n");
a= make_node(a,n);
_print(a);
printf("添加:\n");
a=add(a);
_print(a);
printf("删除:\n");
a=delete(a);
_print(a);
_free(a);
return 0;
}
Node* make_node(Node* a,int n)//创建一个链表,并且存入数据
{
int i;
Node *head = NULL;//第一步
a = (Node*)malloc(sizeof(Node));//第二步
printf("输入数据:\n");
scanf("%d",& a->data);
a->next = NULL;//第三步 存入数据
head = a;// 第四步
i++;
while(i!= n)
{
a = (Node*)malloc(sizeof(Node));
scanf("%d",&a->data);//第五步
a->next = head;//第六步
head = a;//第七步
i++;
}
return a;
}
Node * add(Node *a)//添加数据
{
Node *p;
int data,s;
printf("在哪个数据后面添加:\n");
scanf("%d",&s);
printf("添加的数据为:\n");
scanf("%d",&data);
//开始遍历
p=a;
if(p->next==NULL)//仅有一个数据的链表输出结果
{
p->next=(Node*)malloc(sizeof(Node));
p=p->next;
p->next=NULL;
p->data=data;
return a;
}
else
{
for(;p!=NULL;p=p->next)
{
if(p->data==s)//(1)
{
Node *q;
q=(Node*)malloc(sizeof(Node));
q->data = data;//(2)
q->next = p->next;//(3)
p->next = q;//(4)
return a;
}
}
}
}
Node * delete(Node *a)
{
int data;
Node *p;
printf("需要删除的数据为:\n");
scanf("%d",&data);
//需要删除的数据在第一个
p=a;//(1)
if(a->data==data)
{
a=a->next;//(2)
free(p);//(3)
return a;
}
//不在
else
{
Node *q=NULL;//(1)
for(;p!=NULL;q=p,p=p->next)
{
if(p->data==data)
{
q->next=p->next;//(2)(3)
free(p);
return a;
}
}
}
}
void _print(Node *a)
{
Node *head;
printf("打印结果:\n");
for(head=a;head!=NULL;head=head->next)
{
printf("%d ",head->data);
}
printf("\n");
}
void _free(Node *a)
{
Node *p;
while(a!=NULL)
{
p=a;//(1)
a=a->next;//(2)
free(p);//(3)
}
}