您的位置:首页 > 其它

单链表的创建、插入,删除、查找等操作

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


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: