#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);
}
#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);
}