尾插法建立链表的一些操作程序运行就会显示错误,就大神指教
/*
* tail_create_sort_invertion.c
* 尾插法建立链表并进行排序(大到小),倒置;
*/
#include <stdio.h>
#include <stdlib.h>
typedef char datatype ;
//节点的描述
typedef struct node {
datatype data; //数据域
struct node *next; //指针域
}listnode,*linklist;
linklist tail_createlist(linklist list,int * n); //函数声明
linklist print(linklist list,int n);
linklist sort(linklist list,int n);
linklist invertion(linklist list,int n );
main(void)
{
int count ; //节点数
count = 0;
linklist LIST;
LIST = NULL;
LIST = tail_createlist(LIST,&count);//这样要返回值,因为指针作为函数参数无法改变指针的指向,必须用返回值了
print(LIST,count);
LIST = sort(LIST,count);
print(LIST,count);
LIST = invertion(LIST,count);
printf("\n");
return 0;
}
linklist tail_createlist(linklist list,int * n){
list = (linklist)malloc(sizeof(listnode));//头结点分配空间
//变量声明
linklist p,r; //r为尾指针
r =list = NULL;
datatype ch;
while ((ch = getchar()) != '\n'){
p = (linklist)malloc(sizeof(listnode));
++ *n;
p->data = ch;
r->next = p;
r = p;
}
r->next = NULL;
return (list);
}
linklist print(linklist list,int n){
while (list->next != NULL){
printf("%c",list->next->data);
list = list->next;
}
printf("\n");
printf("%d\n",n);
return 0 ;
}
linklist sort(linklist list,int n){
//用冒泡法做一个循环
linklist sign;
sign = list;
int i , j ;
datatype exchange;
for(i = 1;i<= n;i++){
list = sign;
for(j = 1;j<= n-i;j++){
if((list->next->data) < (list->next->next->data)){
exchange = list->next->next->data;
list->next->next->data = list->next->data;
list->next->data = exchange;
}
list = list->next;
}
}
return (list);
}
linklist invertion(linklist list,int n){
int i , j;
linklist sign;
sign = list;
for(i = 1;i <= n; i++){
list = sign;
for(j = 1; j <= n - i;j++){
list = list->next;
}
printf("%c",list->next->data);
}
return (list);
}