#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("没有找到要删除的结点\n");
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\n",p->data);
else printf("查无此结点\n");
}
List *creat()//建立链表以-1结束
{
printf("请输入创建链表结点值,以-1结束\n");
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.\n");
}
int main() {
List *head;
int n;
printf("\t***链表相关操作***\n");
printf("请选择要进行的操作:\n");
printf("1. 创建链表\n");
printf("2. 排序链表\n");
printf("3. 增加链表结点\n");
printf("4. 删除链表结点\n");
printf("5. 显示链表\n");
printf("6. 查找链表结点\n");
printf("0. 结束程序\n");
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("请选择要进行的操作:\n");
scanf("%d",&n);
}
return 0;
}