#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode * next;
}node,*pnode,*linklist;
pnode create_list(void);//创建一个链表
void traverse_list(pnode phead);//遍历整个链表
bool is_empty(pnode phead);//判断链表是否为空
bool insert_list(pnode,int,int);//在链表中插入一个值
bool delete_list(pnode,int,int *);//删除一个节点
void sort_list(pnode);//对链表进行排序
int length(pnode);//求链表长度
void ldir_sort(pnode l); //链式直接插入排序
void simpl_sort(pnode L);
pnode maxdata(pnode L);
void main(void)
{
int i;
pnode phead;
int pos;//插入和删除的位置
int val;//插入的值,和删除返回的值
while(1)
{
printf("创建链表输入 1 \n");
printf("遍历链表输入 2 \n");
printf("插入值输入 3 \n");
printf("删除值输入 4 \n");
printf("排序输入 5 \n");
printf("直接插入排序 6 \n");
scanf("%d",&i);
if(1==i)
{
phead=create_list();
}
else if(2==i)
{
traverse_list(phead);
}
else if(3==i)
{ printf("输入插入的位置\n\n");
scanf("%d",&pos);
printf("输入插入的值\n\n");
scanf("%d",&val);
insert_list(phead,pos,val);
printf("当前链表为 ");
traverse_list(phead);
printf("\n\n");
}
else if(4==i)
{
printf("输入删除的位置\n\n");
scanf("%d",&pos);
delete_list(phead,pos,&val);
printf("当前链表为 \n\n");
traverse_list(phead);
printf("\n\n");
printf("删除的值为%d \n\n",val);
}
else if(5==i)
{
sort_list(phead);
printf("当前链表序列为 \n");
traverse_list(phead);
printf("\n\n");
}
else if(6==i)
{
simpl_sort(phead);
traverse_list(phead);
}
else{
printf("输入有误\n");
}
}
}
pnode create_list(void)
{int len ; //链表长度
int val; //链表输入值
int i;
pnode phead=(pnode)malloc(sizeof(node));
if(NULL==phead)
{
printf("分配失败");
exit(-1);
}
pnode prear=phead;
prear->next=NULL;
printf("输入要创建表的长度 ");
scanf("%d",&len);
for(i=0;i<len;i++)
{printf("请输入第%d个节点的值\n",i+1);
scanf("%d",&val);
pnode p=(pnode)malloc(sizeof(node));
if(NULL==p)
{
printf("分配失败");
exit(-1);
}
p->data=val;
prear->next=p;
p->next=NULL;
prear=p;
}
return phead;
}
void traverse_list(pnode phead)
{ pnode p=phead->next;
if(NULL==phead)
{
printf("遍历失败\n");
exit(-1);
}
printf("当前链表为 ");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool is_empty(pnode phead)
{
if(NULL==phead->next)
{
return true;
}
else{
return false;
}
}
bool insert_list(pnode phead,int pos,int val) //插入一个值 输入插入的位置和值
{ pnode p=phead;
pnode q=(pnode)malloc(sizeof(node));
q->data=val;
q->next=NULL;
int i=0;
if(pos<0||pos>length(phead)+1) //对输入位置值进行合法判断
{
printf("输入位置非法\n\n\n");
return false;
}
while(i<pos-1)
{
p=p->next;
i++;
}
q->next=p->next;
p->next=q;
return true;
}
int length(pnode phead) //返回链表的长度
{
int i=0;
pnode p=phead->next;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
bool delete_list(pnode phead,int pos,int * val) //删除一个结点 输入删除的位置,并返回删除的值
{ pnode p=phead;
pnode q=p;
int i=0;
if(pos<1||pos>length(phead))
{
printf("删除位置不合法");
return false;
}
while(i<pos-1)
{
p=p->next;
i++;
}
q=p->next;
p->next=p->next->next;
q->next=NULL;
*val=q->data;
free(q);
return true;
}
void sort_list(pnode phead) //对链表进行排序
{ pnode p,q;
int i;
int j=0,k=0;
int temp;//暂存值
printf("升序请输入 1\n");
printf("降序请输入 2\n");
scanf("%d",&i);
if(1==i)
{
for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
if(p->data>q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
}
else if(2==i)
{
for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
if(p->data<q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
}
else
{
printf("你输入有误 \n\n");
}
}
void ldir_sort(pnode l) //链式直接插入排序
{
pnode p=l->next;
pnode pre,r=p->next;
p->next=NULL; //将第一个有效节点断开 使成为只有一个节点的链表
p=r;
while(p!=NULL)
{
pre=l;
r=p->next; // 保证不断链
}
while(pre->next!=NULL&&pre->next->data<p->data)
{
pre=pre->next;
p->next=pre->next;
pre->next=p;
}
p=r;
}
void simpl_sort(pnode L)
{
pnode max;
pnode l=(pnode)malloc(sizeof(node));
l->next=L->next;
L->next=NULL;
while(l->next!=NULL)
{
max=maxdata(l);
max->next=L->next;
L->next=max;
}
}
pnode maxdata(pnode L)
{
pnode max,pre,p;
while(L->next!=NULL)
{
p=L->next;
pre=L;
max=p;
while(p->next!=NULL)
{
if(p->next->data>max->data)
{
pre=p;
max=p->next;
}
p=p->next;
}
pre->next=max->next;
}
return max;
}
#include<malloc.h>
#include<stdlib.h>
typedef struct LNode
{
int data;
struct LNode * next;
}node,*pnode,*linklist;
pnode create_list(void);//创建一个链表
void traverse_list(pnode phead);//遍历整个链表
bool is_empty(pnode phead);//判断链表是否为空
bool insert_list(pnode,int,int);//在链表中插入一个值
bool delete_list(pnode,int,int *);//删除一个节点
void sort_list(pnode);//对链表进行排序
int length(pnode);//求链表长度
void ldir_sort(pnode l); //链式直接插入排序
void simpl_sort(pnode L);
pnode maxdata(pnode L);
void main(void)
{
int i;
pnode phead;
int pos;//插入和删除的位置
int val;//插入的值,和删除返回的值
while(1)
{
printf("创建链表输入 1 \n");
printf("遍历链表输入 2 \n");
printf("插入值输入 3 \n");
printf("删除值输入 4 \n");
printf("排序输入 5 \n");
printf("直接插入排序 6 \n");
scanf("%d",&i);
if(1==i)
{
phead=create_list();
}
else if(2==i)
{
traverse_list(phead);
}
else if(3==i)
{ printf("输入插入的位置\n\n");
scanf("%d",&pos);
printf("输入插入的值\n\n");
scanf("%d",&val);
insert_list(phead,pos,val);
printf("当前链表为 ");
traverse_list(phead);
printf("\n\n");
}
else if(4==i)
{
printf("输入删除的位置\n\n");
scanf("%d",&pos);
delete_list(phead,pos,&val);
printf("当前链表为 \n\n");
traverse_list(phead);
printf("\n\n");
printf("删除的值为%d \n\n",val);
}
else if(5==i)
{
sort_list(phead);
printf("当前链表序列为 \n");
traverse_list(phead);
printf("\n\n");
}
else if(6==i)
{
simpl_sort(phead);
traverse_list(phead);
}
else{
printf("输入有误\n");
}
}
}
pnode create_list(void)
{int len ; //链表长度
int val; //链表输入值
int i;
pnode phead=(pnode)malloc(sizeof(node));
if(NULL==phead)
{
printf("分配失败");
exit(-1);
}
pnode prear=phead;
prear->next=NULL;
printf("输入要创建表的长度 ");
scanf("%d",&len);
for(i=0;i<len;i++)
{printf("请输入第%d个节点的值\n",i+1);
scanf("%d",&val);
pnode p=(pnode)malloc(sizeof(node));
if(NULL==p)
{
printf("分配失败");
exit(-1);
}
p->data=val;
prear->next=p;
p->next=NULL;
prear=p;
}
return phead;
}
void traverse_list(pnode phead)
{ pnode p=phead->next;
if(NULL==phead)
{
printf("遍历失败\n");
exit(-1);
}
printf("当前链表为 ");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
bool is_empty(pnode phead)
{
if(NULL==phead->next)
{
return true;
}
else{
return false;
}
}
bool insert_list(pnode phead,int pos,int val) //插入一个值 输入插入的位置和值
{ pnode p=phead;
pnode q=(pnode)malloc(sizeof(node));
q->data=val;
q->next=NULL;
int i=0;
if(pos<0||pos>length(phead)+1) //对输入位置值进行合法判断
{
printf("输入位置非法\n\n\n");
return false;
}
while(i<pos-1)
{
p=p->next;
i++;
}
q->next=p->next;
p->next=q;
return true;
}
int length(pnode phead) //返回链表的长度
{
int i=0;
pnode p=phead->next;
while(p!=NULL)
{
p=p->next;
i++;
}
return i;
}
bool delete_list(pnode phead,int pos,int * val) //删除一个结点 输入删除的位置,并返回删除的值
{ pnode p=phead;
pnode q=p;
int i=0;
if(pos<1||pos>length(phead))
{
printf("删除位置不合法");
return false;
}
while(i<pos-1)
{
p=p->next;
i++;
}
q=p->next;
p->next=p->next->next;
q->next=NULL;
*val=q->data;
free(q);
return true;
}
void sort_list(pnode phead) //对链表进行排序
{ pnode p,q;
int i;
int j=0,k=0;
int temp;//暂存值
printf("升序请输入 1\n");
printf("降序请输入 2\n");
scanf("%d",&i);
if(1==i)
{
for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
if(p->data>q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
}
else if(2==i)
{
for(j=0,p=phead->next;j<length(phead)-1;j++,p=p->next)
{
for(k=j+1,q=p->next;k<length(phead);k++,q=q->next)
{
if(p->data<q->data)
{
temp=p->data;
p->data=q->data;
q->data=temp;
}
}
}
}
else
{
printf("你输入有误 \n\n");
}
}
void ldir_sort(pnode l) //链式直接插入排序
{
pnode p=l->next;
pnode pre,r=p->next;
p->next=NULL; //将第一个有效节点断开 使成为只有一个节点的链表
p=r;
while(p!=NULL)
{
pre=l;
r=p->next; // 保证不断链
}
while(pre->next!=NULL&&pre->next->data<p->data)
{
pre=pre->next;
p->next=pre->next;
pre->next=p;
}
p=r;
}
void simpl_sort(pnode L)
{
pnode max;
pnode l=(pnode)malloc(sizeof(node));
l->next=L->next;
L->next=NULL;
while(l->next!=NULL)
{
max=maxdata(l);
max->next=L->next;
L->next=max;
}
}
pnode maxdata(pnode L)
{
pnode max,pre,p;
while(L->next!=NULL)
{
p=L->next;
pre=L;
max=p;
while(p->next!=NULL)
{
if(p->next->data>max->data)
{
pre=p;
max=p->next;
}
p=p->next;
}
pre->next=max->next;
}
return max;
}