单链表的创建、插入,删除、查找等操作
2007-04-25 10:39
781 查看
#include<stdio.h>
#include<malloc.h>
typedef struct node //定义链表
...{
int data;
struct node *next;
}snode;
snode* creat() //创建链表的函数
...{
snode *head, *p, *q;
head = (snode *)malloc(sizeof(snode));
p = head;
int x;
printf("请输入创建链表的值,用-1结束输入 ");
printf("x = ");
scanf("%d", &x);
while (x != -1)
...{
q = (snode *)malloc(sizeof(snode));
q->data = x;
p->next = q;
p = q;
printf("x = ");
scanf("%d", &x);
}
p->next = NULL;
return head;
}
int length(snode *head)//测链表的结点数
...{
snode *p = head->next;
int i = 0;
while (p != NULL)
...{
p = p->next;
i++;
}
return i;
}
void display(snode *head) //依次输出每个结点的值
...{
snode *p = head->next;
for(int i = 0; i < length(head); i++)
...{
printf("%4d", p->data);
p = p->next;
}
printf(" ");
}
int locate(snode *head, int x) //测x在链表中的位置
...{
snode *p = head->next;
int i = 1;
while (p != NULL && x != p->data)
...{
p = p->next;
i++;
}
if (p == NULL) //什么叫等于,两个等号才叫等于.
return 0;
else
return i;
}
int insnode(snode *head, int x, int i) //把x插入到链表的第i的位置
...{
snode *p = head->next, *s;
int j;
if(i < 1 || i > length(head) + 1)
return 0;
else if (i == 1)
...{
s = (snode *)malloc(sizeof(snode));
s->next = p;
head->next = s;
s->data = x;
}
else
...{
for (j = 1; j < i - 1; j++)
p = p->next;
s = (snode *)malloc(sizeof(snode));
s->next = p->next;
p->next = s;
s->data = x;
}
return 1;
}
int delnode(snode *head, int i)//删除链表中第i个结点
...{
snode *p = head->next, *q = head;
if(i < 1 || i > length(head))
return 0;
else if (i == 1)
...{
head->next = p->next;
free(p);
}
else
...{
for (int j = 1; j < i; j++)
...{
p = p->next;
q = q->next;
}
q->next = p->next;
free(p);
}
return 1;
}
void sort(snode *head) //把链表中每个结点的值按从小到大排列
...{
snode *p, *q;
int k;
for(p = head->next; p != NULL; p = p->next)
for(q = p->next; q != NULL; q = q->next)
if (p->data > q->data)
...{
k = p->data;
p->data = q->data;
q->data = k;
}
}
void insert(snode *head, int x) //在有序链表中插入x,插入后仍保持有序
...{
snode *p = head->next, *s, *q = head;
while (p != NULL && p->data < x)
...{
q = q->next;
p = p->next;
}
s = (snode *)malloc(sizeof(snode));
s->next = q->next;
s->data = x;
q->next = s;
}
void del_min_max(snode *head, int min, int max) //删除有序链表中值min到值max中的结点
...{
snode *p = head->next, *q = head;
while (p != NULL && p->data <= min)
...{
q = p;
p = p->next;
}
while (p != NULL && p->data < max)
...{
q->next = p->next;
free(p);
p = q->next;
}
}
void del_min(snode *head) // 删除数据域最小的结点
...{
snode *p = head->next, *q = head;
snode *p_min, *q_min;
p_min = p;
q_min = q;
while (p != NULL)
...{
q = p;
p = p->next;
if (p != NULL && p->data < p_min->data)
...{
q_min = p_min;
p_min = p;
}
}
q_min->next = p_min->next;
free(p_min);
}
int main(void)
...{
snode *headl = creat(); //创建链表
printf("最初的链表如下: ");
display(headl);
int num, location;
printf("请输入您要查找的数:");
scanf("%d", &num);
if (locate(headl, num))
printf("数字%d在链表中的位置为%d ", num, locate(headl, num));
else
printf("数字%d在链表中不存在 ", num);
printf("请分别输入您要插入到链表中的数以及想插入的位置:");
scanf("%d %d", &num, &location);
if (insnode(headl, num, location))
...{
printf("插入新值以后的链表如下: ");
display(headl);
}
else
printf("输入有误 ");
printf("请输入您想删除的结点位置:");
scanf("%d", &location);
if (delnode(headl, location))
...{
printf("删除第%d个结点后的链表如下: ", location);
display(headl);
}
else
printf("输入有误! ");
sort(headl); //排序
printf("经过把结点数据按从小到大排序以后的链表如下: ");
display(headl);
printf("请输入一个将被插入到有序链表中的数:");
scanf("%d", &num);
insert(headl, num);
printf("将%d插入到有序链表中后,链表仍然有序,如下: ", num);
display(headl);
int min, max;
printf("请输入需要删除的一段结点的头和尾,他们之间的结点将被删除:");
scanf("%d %d", &min, &max);
del_min_max(headl, min, max);
printf("经过删除以后的链表如下: ");
display(headl);
printf("经过删除最小数据域的结点以后的链表如下: ");
del_min(headl);
display(headl);
}
相关文章推荐
- 单链表的创建、初始化、插入、删除 、输出、求表长、清空、查找操作
- 单链表-创建、插入、删除、查找、反转等操作
- 单链表的创建,查找,删除,插入。
- 单链表的创建、插入、删除、倒置操作
- C语言之数据结构的顺序单链表创建,插入和删除操作
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- 26个字母单链表,实现插入,删除,查找操作
- java实现单链表的初始化,创建,删除,插入,查找,排序,同项删除,退出等功能
- 单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印
- 单链表的创建、插入、删除、销毁以及查找中间结点
- javasript 的DOM 节点操作:创建,插入,删除,复制以及查找节点
- 单链表的基本操作(创建、删除、插入、遍历)
- 数据结构之链表操作,创建,插入,删除,查找。
- C++单链表的创建插入删除以及逆序操作
- Linked List的基本操作(创建/删除/插入/查找)
- C++实现单链表的创建、插入、删除、逆置操作
- C++单链表的动态创建,查找,遍历,删除,插入,添加,排序
- C语言单链表的创建、插入、查找、删除、求长、排序、遍历
- 单链表的创建、插入、删除、倒置操作
- 算法学习-数据结构之链表操作,创建,插入,删除,查找。