/*-------------------------------------------------------预处理命令-----------------------------------------------------*/
#include<stdio.h>
#include<stdlib.h>
/*--------------------------------------------------全局声明部分---------------------------------------------------*/
struct link_list
{
int data;
struct link_list *next;
};
struct link_list *creat_linklist(void);
int show_linklist(struct link_list *s);
void del_linklist(struct link_list *s);
void incert_node(struct link_list *s,int a);
void data_incert_node(struct link_list *s,int _data);
struct link_list *sort_linklist(struct link_list *s,int n);
/*-------------------------------------------------------主函数-----------------------------------------------------*/
int main(void)
{
int n=0;
struct link_list *start;
start=creat_linklist();
n=show_linklist(start);
incert_node(start,3);
n=show_linklist(start);
data_incert_node(start,4);
n=show_linklist(start);
start=sort_linklist(start,n);
n=show_linklist(start);
del_linklist(start);
getchar();
return 0;
}
/*--------------------------------------------------尾插法创建链表--------------------------------------------------------*/
struct link_list *creat_linklist(void)
{
struct link_list *s,*x,*c;
int _data,i=0;
s=x=c=NULL;
printf("Please input data:");
scanf("%d",&_data);
while(_data!=-1)/*用输入的值控制链表的创建*/
{
i++;
c=(struct link_list *)malloc(sizeof(struct link_list));/*创建结点,*/
if(s==NULL)/*如果链表头指针还没有指向任何结点,让头指针指向新申请的空间*/
{
s=c;
}
c->next=NULL;/*让申请到的结点中的地址域,指向空*/
x->next=c;
x=c;
c->data=_data;
printf("%d:",i);
scanf("%d",&_data);
}
return s;
}
/*--------------------------------------------------输出链表--------------------------------------------------------*/
int show_linklist(struct link_list *s)/*输出链表的每个结点*/
{
int i=0;
while(s)
{
i++;
printf("%d/t",s->data);
s=s->next;
}
printf("/n");
return i;/*返回链表的结点数*/
}
/*------------------------------------------在指定位置 insert node------------------------------------------------*/
void incert_node(struct link_list *s,int a)/*在链表的第a个结点处插入一个新的结点*/
{
int i=0;
struct link_list *in,*rem,*temp;
rem=s;
in=(struct link_list*)malloc(sizeof(struct link_list));
in->next=NULL;
printf("Please input node_data:/n");
scanf("%d",&in->data);
while(rem&&i<a-1)/*找到指定位置前一个node*/
{
rem=rem->next;
i++;
}
if(!rem||i>a-1)/*如果结点rem不等于空或变量i大于a-1的情况下执行下面的程序块*/
{
printf("The node is error!/n");
return;
}
else/*否则将创建的节点插入预定位置*/
{
in->next=rem->next;/*新结点的地址域与rem的地址域一致*/
rem->next=in;/*让rem指向新节点*/
}
return;/*插入新结点完成,返回主调函数*/
}
/*------------------------------------------根据数据域大小 insert node------------------------------------------------*/
void data_incert_node(struct link_list *s,int _data)/*另一个插入结点的方法*/
{
struct link_list *x,*temp;
x=(struct link_list*)malloc(sizeof(struct link_list));/*创建新节点*/
x->data=_data;
while(s)/*结点值为非空就可以继续循环*/
{
temp=s;
s=s->next;
if(x->data<s->data)/*判断新节点与链表中各节点的大小关系 符合判断关系式的将节点插入链表*/
{
temp->next=x;
x->next=s;
break;
}
else if(temp->next==NULL)/*不符合条件的链表位向下一结点走一步*/
{
x->next=temp->next;
temp->next=x;
break;
}
}
return;
}
/*--------------------------------------------------链表排序--------------------------------------------------------*/
struct link_list *sort_linklist(struct link_list *s,int y)/*关键的地方到了,我整了3天才弄出来的*/
{
struct link_list *temp,*x,*first;/*声明3个结构型的指针变量*/
int i=0;
x=first=s;/*两个变量都指向链表的头结点*/
for(i=0;i<y;i++)/*按冒泡法建立外循环*/
{
temp=first;/*让temp在每一次都从第一结点开始*/
s=x=temp->next;/*而指针s和指针x都指向第一结点的内存*/
while(s->next!=NULL)/*当s的地址域为空时终止循环*/
{
if(x->data<s->next->data)/*做逆序排列*/
{
s=s->next;/*s指向x的下一链表位置*/
temp->next=s;/*让temp所指链表的地址域指向s所指链表结点位置*/
x->next=s->next;/*将x地址域中的地址更新为两个比较结点后的结点地址*/
s->next=x;/*两个链表中比较值大的一个指向值小的链表结点位置*/
s=x;/*让两个指针指向同一链表结点*/
temp=temp->next;/*temp继续向前一步走*/
}
else/*不符合条件的情况下所有指针地址向前一步走*/
{
temp=temp->next;
s=x=temp->next;
}
}
}
return first;
}
/*--------------------------------------------------释放链表--------------------------------------------------------*/
void del_linklist(struct link_list *s)
{
struct link_list *second;
second=s;
while(s)/*逐步释放链表的每个结点*/
{
second=s->next;
free(s);
s=second;
}
printf("%x/t%x/n",s,second);
return ;
}
运行过几次感觉没什么问题了
有不足的地方请大家
无情的指出!
谢谢