首先,要创建一个链表,我们需要定义一个结构体:
typedef struct _Node{
int value;
struct _Node * next;
}Node;
为了使链表更具操控性与灵活性,我们可以再定义一个结构体来存放它的头部和尾部等:
typedef struct _List{
Node * head;
Node * tail;
}List;
1、创建:
int main(void)
{
int number;
List list;
list.head=list.tail=NULL; //初始化指针
do{
scanf("%d",&number);
if(number!=-1){
Node*p=(Node*)malloc(sizeof(Node)); //此处需动态申请内存,需要添加头文件<stdlib.h>
p->value=number;
p->next=NULL; //初始化
if(list.tail){
while(list.tail->next){
list.tail=list.tail->next;
}
list.tail->next=p;
}
else list.head=list.tail=p;
}
}while(number!=-1);
return 0;
}
我们也可以将其单独拿出来作为一个创建函数:
void add(List * plist); //由于此前创建了List结构体,此处只需将结构体的指针传入即可进行操作
其余部分稍作修改:
void add(List * plist)
{
int number;
do{
scanf("%d",&number);
if(number!=-1){
Node*p=(Node*)malloc(sizeof(Node));
p->value=number;
p->next=NULL;
if(plist->tail){
while(plist->tail->next){
plist->tail=plist->tail->next;
}
plist->tail->next=p;
}
else plist->head=plist->tail=p;
}
}while(number!=-1);
}
2、输出:
我们直接其按照函数形式(下同):
void print(List * plist)
{
for(Node*p=plist->head;p;p=p->next){
printf("%d\t",p->value);
}
printf("\n");
}
3、搜索:
void search(List * plist)
{
int num;
int isFound=0;
scanf("%d",&num);
for(Node*p=plist->head;p;p=p->next){ //链表常用经典for循环
if(num==p->value){
printf("IS FOUND!");
isFound=1;
break;
}
if(!isFound)
printf("NOT FOUND!");
}
}
4、删除:
void _delete(List * plist)
{
int num;
scanf("%d",&num);
Node*q=NULL;
for(Node*p=plist->head;p;q=p,p=p->next){
if(q){ //这里注意保护指针 q,防止边界情况!
if(num==p->value){
q->next=p->next;
}
}
else{
plist->head=plist->head->next;
}
free(p); //记得释放内存(即为删除)
break;
}
}
5、清除:
void destroy(List * plist)
{
Node*q=NULL;
for(Node*p=plist->head;p;p=q){
q=p->next;
free(p);
}
}
*为了使整体代码更加简洁明了,我们可以使用多个头文件分别存放数据,例如:
我们分别创建Struct.c , Function.c
用来存放结构和函数
Struct.c
:
typedef struct _Node{
int value;
struct _Node *next;
}Node;
typedef struct _List{
Node*head;
Node*tail;
}List;
Function.c
:
#include "Struct.c"
void add(List * plist);
void print(List * plist);
void search(List * plist);
void _delete(List * plist);
void destroy(List * plist);
最终,记得在main.c
中添加#include "Function.c"