linkedlist.c
#include "linkedlist.h"
#include <stdio.h>
#include <stdlib.h>
/*
Create_linkedlist: 创建一个链表
void:无参数
返回值:
第一个节点的指针 Node *
*/
Node * Create_linkedlist(void)
{
Node * p = NULL; //指向要插入的那个结点
Node * h = NULL; //指向链表的第一个结点
Node * last = NULL; //指向链表的最后一个结点
int dat;
while(1)
{
scanf("%d", &dat);
if(dat == 0) //用户输入0表示输入结束
{
break;
}
//p = (Node *)malloc(sizeof(Node));
p = (Node *)malloc(sizeof(*p));
p->data = dat;
p->next = NULL;
if(h == NULL)
{
h = last = p;
}
else
{
//* 尾插法
last->next = p;
last = p;
//头插法
//p->next = h;
//h = p;
}
}
return h;
}
/*
Create_order_linkedlist: 创建一个有序链表
void:无参数
返回值:
第一个节点的指针 Node *
*/
Node * Create_order_linkedlist(void)
{
Node * p = NULL; //指向要插入的那个结点
Node * first = NULL; //指向链表的第一个结点
//Node * last = NULL; //指向链表的最后一个结点
int dat;
while(1)
{
scanf("%d", &dat);
if(0 == dat)
{
break; //表示输入结束
}
p = (Node *)malloc(sizeof(*p));
p->data = dat;
p->next = NULL;
//把p添加到链表中
first = add_node(p , first);
}
return first;
}
/*
add_node:向一个有序的链表中去添加一个结点
添加完了之后,使链表任然有序
@p : 你要插入的那个结点
@h : 链表的第一个结点的指针
返回值:
返回插入之后的那个链表的第一个结点的指针
*/
Node * add_node(Node * p, Node * h)
{
if(p == NULL)
{
return h;
}
if(h == NULL)
{
return p;
}
Node * pk = NULL; //pk指向第一个比待插入结点大的那一个
Node * pr = NULL; //pr指向pk的前面那一个结点的
pk = h;
//查找第一个比我大的那个结点
while(pk)
{
if(pk->data > p->data)
{
//呵呵 ,找到了
break;
}
pr = pk;
pk = pk->next;
}
if(pk == NULL)//没有找到
{
//尾插法 此刻的last为pr
pr->next = p;
pr = p; //可有可无
}
else //找到了
{
if(pk == h)//第一个就比我大 "头插法"
{
p->next = h;
h = p;
}
else //“中间插入” pr-> p ->pk
{
pr->next = p;
p->next = pk;
}
}
return h;
}
//打印数据结点的每一个数据元素的值
void print(Node * h)
{
if(h == NULL)
{
return;
}
Node * p = h;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
/*
delete_x:删除链表中的一个结点
@h : 原链表第一个结点的指针
@x :要删除的那个结点的数据域
返回值:
返回删除后的链表的第一个结点的指针
*/
Node * delete_x(Node * h, Elemtype x)
{
Node * px = h; //指向要删除的那个结点
Node * pr = NULL;// 指向要删除的那个结点的前面那一个结点
while(px)
{
if(px->data == x)
{
//找到啦
break;
}
pr = px;
px = px->next;
}
if(px == NULL) //没有找到
{
return h;
}
//找到啦
if(px == h)//你要删除的使第一个结点
{
h = px->next;
px->next = NULL;
free(px);
}
else //要么是中间的结点,要么是最后一个结点
{
pr->next = px->next;
px->next = NULL;
free(px);
}
}
/*
delete_all_x:删除链表中的一个结点
@h : 原链表第一个结点的指针
@x :要删除的那个结点的数据域
返回值:
返回删除后的链表的第一个结点的指针
*/
Node * delete_all_x(Node * h, Elemtype x)
{
Node * px = h; //指向要删除的那个结点
Node * pr = NULL;// 指向要删除的那个结点的前面那一个结点
Node * ps = h; //每一次查找的起点
while(1)
{
px = ps;//每一次从ps查找
while(px)
{
if(px->data == x)
{
//找到啦
break;
}
pr = px;
px = px->next;
}
if(px == NULL) //没有找到
{
return h;
}
//找到啦
ps = px->next;
if(px == h)//你要删除的使第一个结点
{
h = px->next;
px->next = NULL;
free(px);
}
else //要么是中间的结点,要么是最后一个结点
{
pr->next = px->next;
px->next = NULL;
free(px);
}
}
}
main.c
#include <stdio.h>
#include "linkedlist.h"
#include <stdlib.h>
int main()
{
/*
Node * a = (Node *)malloc(sizeof(Node));
Node * b = (Node *)malloc(sizeof(Node));
Node * c = (Node *)malloc(sizeof(Node));
Node * d = (Node *)malloc(sizeof(Node));
Node * e = (Node *)malloc(sizeof(Node));
a->data = 1;
a->next = b;
b->data = 2;
b->next = c;
c->data = 5;
c->next = d;
d->data = 4;
d->next = e;
e->data = 7;
e->next = NULL;
print(a);
free(a);
free(b);
free(c);
free(d);
free(e);
return 0;
*/
Node * h = NULL;
//h = Create_linkedlist(); //无序的
//print(h);
//printf("------------\n");
Node * first = Create_order_linkedlist();
print(first);
printf("------------\n");
int x;
scanf("%d", &x);
first = delete_all_x(first, x);
print(first);
}
linkedlist.h
#ifndef __LINKEDLIST_H__
#define __LINKEDLIST_H__
typedef int Elemtype; //数据元素的类型
typedef struct node
{
Elemtype data;//数据域
struct node * next; // 保存下一个数据结点的地址
//struct node * prev; //保存上一个数据结点的地址
}Node ;
/*
Create_linkedlist: 创建一个链表
void:无参数
返回值:
第一个节点的指针 Node *
*/
Node * Create_linkedlist(void);
/*
Create_order_linkedlist: 创建一个有序链表
void:无参数
返回值:
第一个节点的指针 Node *
*/
Node * Create_order_linkedlist(void);
/*
add_node:向一个有序的链表中去添加一个结点
添加完了之后,使链表任然有序
@p : 你要插入的那个结点
@h : 链表的第一个结点的指针
返回值:
返回插入之后的那个链表的第一个结点的指针
*/
Node * add_node(Node * p, Node * h);
//打印数据结点的每一个数据元素的值
void print(Node * h);
/*
delete_x:删除链表中的一个结点
@h : 原链表第一个结点的指针
@x :要删除的那个结点的数据域
返回值:
返回删除后的链表的第一个结点的指针
*/
Node * delete_x(Node * h, Elemtype x);
/*
delete_all_x:删除链表中的一个结点
@h : 原链表第一个结点的指针
@x :要删除的那个结点的数据域
返回值:
返回删除后的链表的第一个结点的指针
*/
Node * delete_all_x(Node * h, Elemtype x);
#endif