#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语言代码示例。
6156





