#include <stdio.h> #include <stdlib.h> #define LEN sizeof(struct node) typedef struct node{ int data; struct node *next; }List; List *selectsort(List *head) { List *p,*q,*min; int tmp; for(p=head;p->next!=NULL;p=p->next) { min=p; for(q=p->next;q!=NULL;q=q->next) if(q->data<min->data) min=q; if(min!=p) { tmp=p->data; p->data=min->data; min->data=tmp; } } return head; } List *insfun(List *head)//在已排好升序的链表中插入一个结点,仍保持升序 { List *p1,*p2,*p; int m; printf("请输入要插入的结点的值:"); scanf("%d",&m); p1=(List*)malloc(LEN); p1->data=m; if(head==NULL) { head=p1;p1->next=NULL;return head; } p=p2=head; if(m<=head->data) { p1->next=head; head=p1; return head; } while(p2&&m>=p2->data) { p=p2; p2=p2->next; } p->next=p1; p1->next=p2; return head; } List *delfun(List *head)//删除结点 { List *p1,*p2,*p; int m;//m代表要删除的结点值 printf("请输入要删除的结点:"); scanf("%d",&m); if(head==NULL)return NULL; if(m==head->data)//如果m恰好等于头结点,让head指向下一个结点 { p=head; head=head->next; free(p); return head; } p2=head;p1=head->next; while(p1&&p1->data!=m) { p2=p1; p1=p1->next; } if(p1!=NULL)//表示找到了要删除的结点 { p=p1; p2->next=p1->next; free(p); } else printf("没有找到要删除的结点 "); return head; } void findfun(List *head)//查找值为n的结点 { List *p=head;int n; if(head==NULL)return; printf("请输入要查找的结点值:"); scanf("%d",&n); while(p&&p->data!=n) p=p->next; if(p) printf("找到此结点,其值为:%d ",p->data); else printf("查无此结点 "); } List *creat()//建立链表以-1结束 { printf("请输入创建链表结点值,以-1结束 "); List *head=NULL,*p1,*p2; p1=p2=(List*)malloc(LEN); scanf("%d",&p1->data); while(p1->data>=0) { if(head==NULL)head=p1; else p2->next=p1; p2=p1; p1=(List*)malloc(LEN); scanf("%d",&p1->data); } p2->next=NULL; return head; } void print(List *head)//输出链表 { List *p=head; if(head==NULL)return; while(p) { printf("%4d",p->data); p=p->next; } printf(" end. "); } int main() { List *head; int n; printf(" ***链表相关操作*** "); printf("请选择要进行的操作: "); printf("1. 创建链表 "); printf("2. 排序链表 "); printf("3. 增加链表结点 "); printf("4. 删除链表结点 "); printf("5. 显示链表 "); printf("6. 查找链表结点 "); printf("0. 结束程序 "); scanf("%d",&n); while(n>6||n<0) { printf("输入错误,请重新输入");scanf("%d",&n); } while(n>=0) { switch(n) { case 1:head=creat(head);print(head);break; case 2:head=selectsort(head);print(head);break; case 3:head=insfun(head);print(head);break; case 4:head=delfun(head);print(head);break; case 5:print(head);break; case 6:findfun(head);break; case 0:return 0; default:printf("输入错误,请重新输入");scanf("%d",&n);break; } printf("请选择要进行的操作: "); scanf("%d",&n); } return 0; }