单链表的创建, 删除, 插入, 输出
2009-08-01 20:44
357 查看
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}Node, *Linklist;
int node_num = 0;
void creat(Node *head); //创建链表
void print(Node *head); //输出链表
Node *query(Node *head, int value); //查找
void *del_node(Node *head, int value); //对链表的删除节点
void insert_node(Node *head, Node * inser); //插 入 到 有 序 的 链 表
int main(void)
{
int value;
Node *head, *inser;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
creat(head);
print(head);
getchar();
getchar(); //当以IF里调用函数,必须加getchar(),假如调用函数不在IF里, 单独作为一句调用,可以不用getchar();
printf("请输入要查找的数值:/n");
scanf("%d", &value);
getchar();
if (NULL == query(head, value))
{
printf("not found!/n");
}
else
{
printf("找到了,地址是%p/n", query(head, value));
}
printf("请输入要删除的数值:/n");
scanf("%d", &value);
del_node(head, value);
print(head);
printf("请输入要插入的数字/n");
/**/inser = (Node *)malloc(sizeof(Node)); //开始做的时候忽略了, 犯了大错啦,指针不初始化是不能存东西的, 傻瓜!!!
scanf("%d", &inser->data) ;
insert_node(head, inser);
getchar();
printf("插入后的链表 为:/n");
print(head);
return 0;
}
void creat(Node *head) //head 不放数据的(数据结构书page45)
{
Node *p = head;
Node *s;
int data;
printf("建立新链表,输入非数字字符将结束输入:/n");
while(1 == scanf("%d",&data)) //用头插法
{
s = (Node *)malloc(sizeof(Node));
node_num = node_num +1;
s->data = data;
s->next = p->next;
p->next = s;
}
/*while (1 == scanf("%d", &data)) // 尾插法
{
s = (Node *)malloc(sizeof(Node));
s->data = data;
p->next = s;
p = s;
}
p->next = NULL;*/
}
void print(Node *head)
{
Node *p = head->next;
printf("链表的数据如下:/n");
while (p != NULL)
{
printf("%d/t", p->data);
p = p->next;
}
printf("/n");
}
Node * query(Node *head, int value)
{
Node *p = head;
while(p != NULL)
{
if (p->data == value)
return p;
else
p = p->next;
}
return NULL;
}
void *del_node(Node *head, int value)
{
Node *pre , *p ;
p = head->next;
pre = p;
while( p->data != value && p->next != NULL ) //查找过程
{
pre = p;
p = p->next;
}
if (p->data == value) //找到啦, (*^__^*) 嘻嘻……
{
/***/ if (p == head->next) //这个里面的IF是之后加上的啦, (*^__^*) 嘻嘻……
head->next = p->next;
else
{
pre->next = p->next ;
free(p);
return ;
}
}
else //没有找到, 嘿嘿
printf("没有找到要删除的节点!/n");
return ;
}
void insert_node(Node *head, Node * inser)
{
Node *p = head->next;
Node *pre = p;
if (head->next == NULL) //原表是空表
{
head->next = inser;
inser->next = NULL;
}
else
{
while (inser->data > p->data && p->next !=NULL)
{
pre = p;
p = p->next;
}
if(inser->data <= p->data) //找到位置插入
{
if (p == head->next) //插在表头之后
head->next = inser;
else //插在表中间
pre->next = inser;
inser->next = p;
}
else //搜集完了, 插在表尾
{
p->next = inser;
inser->next =NULL;
}
}
return;
}
#include<malloc.h>
typedef struct node
{
int data;
struct node *next;
}Node, *Linklist;
int node_num = 0;
void creat(Node *head); //创建链表
void print(Node *head); //输出链表
Node *query(Node *head, int value); //查找
void *del_node(Node *head, int value); //对链表的删除节点
void insert_node(Node *head, Node * inser); //插 入 到 有 序 的 链 表
int main(void)
{
int value;
Node *head, *inser;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
creat(head);
print(head);
getchar();
getchar(); //当以IF里调用函数,必须加getchar(),假如调用函数不在IF里, 单独作为一句调用,可以不用getchar();
printf("请输入要查找的数值:/n");
scanf("%d", &value);
getchar();
if (NULL == query(head, value))
{
printf("not found!/n");
}
else
{
printf("找到了,地址是%p/n", query(head, value));
}
printf("请输入要删除的数值:/n");
scanf("%d", &value);
del_node(head, value);
print(head);
printf("请输入要插入的数字/n");
/**/inser = (Node *)malloc(sizeof(Node)); //开始做的时候忽略了, 犯了大错啦,指针不初始化是不能存东西的, 傻瓜!!!
scanf("%d", &inser->data) ;
insert_node(head, inser);
getchar();
printf("插入后的链表 为:/n");
print(head);
return 0;
}
void creat(Node *head) //head 不放数据的(数据结构书page45)
{
Node *p = head;
Node *s;
int data;
printf("建立新链表,输入非数字字符将结束输入:/n");
while(1 == scanf("%d",&data)) //用头插法
{
s = (Node *)malloc(sizeof(Node));
node_num = node_num +1;
s->data = data;
s->next = p->next;
p->next = s;
}
/*while (1 == scanf("%d", &data)) // 尾插法
{
s = (Node *)malloc(sizeof(Node));
s->data = data;
p->next = s;
p = s;
}
p->next = NULL;*/
}
void print(Node *head)
{
Node *p = head->next;
printf("链表的数据如下:/n");
while (p != NULL)
{
printf("%d/t", p->data);
p = p->next;
}
printf("/n");
}
Node * query(Node *head, int value)
{
Node *p = head;
while(p != NULL)
{
if (p->data == value)
return p;
else
p = p->next;
}
return NULL;
}
void *del_node(Node *head, int value)
{
Node *pre , *p ;
p = head->next;
pre = p;
while( p->data != value && p->next != NULL ) //查找过程
{
pre = p;
p = p->next;
}
if (p->data == value) //找到啦, (*^__^*) 嘻嘻……
{
/***/ if (p == head->next) //这个里面的IF是之后加上的啦, (*^__^*) 嘻嘻……
head->next = p->next;
else
{
pre->next = p->next ;
free(p);
return ;
}
}
else //没有找到, 嘿嘿
printf("没有找到要删除的节点!/n");
return ;
}
void insert_node(Node *head, Node * inser)
{
Node *p = head->next;
Node *pre = p;
if (head->next == NULL) //原表是空表
{
head->next = inser;
inser->next = NULL;
}
else
{
while (inser->data > p->data && p->next !=NULL)
{
pre = p;
p = p->next;
}
if(inser->data <= p->data) //找到位置插入
{
if (p == head->next) //插在表头之后
head->next = inser;
else //插在表中间
pre->next = inser;
inser->next = p;
}
else //搜集完了, 插在表尾
{
p->next = inser;
inser->next =NULL;
}
}
return;
}
相关文章推荐
- 线性表---单链表(创建、插入、删除、排序、测长和打印输出)
- 单链表的常用操作,包括单链表的创建、插入、删除、排序、逆置以及打印输出等
- 单链表的创建(头插尾插),表长,输出,插入,删除,查找,逆置,分解长两个链表(奇数偶数链表),查找倒数第k个元素,产出相同元素
- 单链表的创建、初始化、插入、删除 、输出、求表长、清空、查找操作
- 单链表,双向链表的插入,查询,创建,删除,输出
- 链表初解(一)——单链表的创建、删除、插入、测长、排序、逆置
- 单链表创建-遍历-排序-插入-删除-逆序操作
- 建立完整的单向动态链表(包括初始化、创建、插入、删除、查找、销毁、输出)
- java实现单链表的初始化,创建,删除,插入,查找,排序,同项删除,退出等功能
- 单链表的创建、插入、删除等操作
- 单链表的创建,删除,插入
- 单链表的创建,删除,插入,排序
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 单链表的创建,删除,插入,显示,排序
- 单链表-创建、插入、删除、查找、反转等操作
- 单链表的创建、插入、删除、倒置操作
- 数据结构单链表插入\整表删除\整表创建\
- 单链表的创建,删除,插入,翻转,打印--数组存入单链表,单链表翻转
- 单链表的创建、插入、删除;创建采用两种不同的方式:一种是从表头到表尾,另一种是从表尾到表头!
- 单链表的创建、插入、删除、倒置操作