main.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
int main()
{
NODE *p = creat_node();
printf_list(p);
free_list(p);
printf_list(p);
int a = find_node(p,2);
if(a == 1)
{
printf("找到了\n");
}
else
{
printf("没找到\n");
}
NODE *q = delete_node(p,2); //!!!定义接收
printf_list(q);
NODE *r = insert_node(p,5);
printf_list(r);
}
list.c
#include <stdio.h>
#include <stdlib.h>
#include "list.h"
NODE* creat_node() //创建链表
{
int x;
NODE *p = NULL;
NODE *first = NULL;
NODE *last = NULL;
while(1)
{
scanf("%d",&x);
if(x == 0)
{
break;
}
p = (NODE*)malloc(sizeof(NODE));
p->data = x;
p->next = NULL;
if(first == NULL)
{
first = p;
last = p;
}
else
{
#if 1 //尾插法
last->next = p;
last = p;
#else //头插法
p->next = last;
first = p;
#endif
}
}
return first;
}
void printf_list(NODE *first) //打印链表
{
while(first)
{
printf("%d ",first->data);
first = first->next;
}
printf("\n");
}
//释放链表 重点在于保存下一个结点,free不被丢失
void free_list(NODE *first)
{
NODE *p = first; //用于循环
NODE *k =NULL; //用于保存下一个结点的地址
while(p)
{
k = p->next;
p->data = 0;
p->next = NULL;
free(p);
p = k;
}
}
int find_node(NODE *first,Elemtype x)
{
while(first)
{
if(first->data == x)
{
return 1;//找到了 //函数执行return后就不会往下再执行
}
first = first->next;
}
return 0; //没找到
}
//删除结点重点在于保存前驱结点 3种情况
NODE* delete_node(NODE *first,Elemtype x)
{
NODE *p = first; //用来循环
NODE *r = NULL; //用来保存前驱结点
NODE *k = NULL;
while(p) //先遍历找到x结点
{
if(p->data == x)
{
break;
}
r = p;
p = p->next;
}
if(p != NULL)
{
if(r == NULL) //表示为第一个结点
{
k = first;
first = first->next;
k->data = 0;
k->next = NULL;
free(k);
}
else if(p->next == NULL) //表示为最后一个结点
{
r->next = NULL;
p->data = 0;
free(p);
}
else //为中间
{
r->next = p->next;
p->data = 0;
p->next = NULL;
free(p);
}
return first;
}
else
{
printf("没有x结点\n");
return first;
}
}
/*
在升序的链表中插入一个数据域为x的节点
使其仍然有序
*/
NODE* insert_node(NODE *first,Elemtype x)
{
NODE *p = first; //用来循环
NODE *r = NULL; //保存前驱结点,方便插入
NODE *q = (NODE*)malloc(sizeof(NODE));
q->data = x;
q->next = NULL;
while(p) //遍历找插入位置
{
if(p->data > x)
{
break;
}
r = p;
p = p->next;
}
if(r == NULL) //为第一个
{
q->next = first;
first = q;
}
else if(p == NULL) //最后一个
{
r->next = q;
q->next =NULL;
}
else //中间
{
r->next = q;
q->next = p;
}
return first;
}
list.h
#ifndef __LIST_H__
#define __LIST_H__
typedef int Elemtype;
struct node
{
Elemtype data;
struct node *next;
};
typedef struct node NODE;
NODE* creat_node();
void printf_list(NODE *first);
void free_list(NODE *first);
int find_node(NODE *first,Elemtype x);
NODE* delete_node(NODE *first,Elemtype x);
NODE* insert_node(NODE *first,Elemtype x);
typedef struct node NODE;
#endif