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