#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));
q = head;
int x;
printf("请输入创建链表的值,用-1结束输入 ");
printf("x = ");
scanf("%d", &x);
while (x != -1)
{
p = (snode *)malloc(sizeof(snode));
p->data = x;
q->next = p;
q = p;
printf("x = ");
scanf("%d", &x);
}
q->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, *s;
int j;
if(i < 1 || i > length(head) + 1||!p)
return 0;
else
{
for (j = 0; j < i - 1; j++)//找到要插入位置的前驱p
{
p = p->next;
}
s = (snode *)malloc(sizeof(snode));
s->data=x;
s->next = p->next;//插入 两步完成
p->next = s;
}
return 1;
}
int delnode(snode *head, int i)//删除链表中第i个结点
{
snode *p = head, *q;
if(i < 1 || i > length(head)||!q)
return 0;
else
{
for (int j =0; j < i-1; j++)//找到要删除点的前驱
{
p = p->next;
}
q = p->next;//q指向要删除的点
p->next = q->next;//删除 一步
free(q);
}
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)//p->一直更新保证是最小值
{
k = p->data;
p->data = q->data;
q->data = k;
}
}
void insert(snode *head, int x) //在有序链表中插入x,插入后仍保持有序
{
snode *p = head, *s, *q = head;
while (p != NULL && p->data < x)
{
p = p->next;
}
s = (snode *)malloc(sizeof(snode));
s->data = x;
s->next = q->next;
q->next = s;
}
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);
}
单链表的实现
最新推荐文章于 2022-07-16 17:52:33 发布