不造谣,不信谣,不传谣!
题目
《算法笔记》练习题,见3http://codeup.hustoj.com/problem.php?cid=100000607&pid=4
代码
使用头插法和尾插法进行链表的建立即可,编码过程中注意内存的管理,不要有内存泄漏(不知道没有这个会不会影响结果)。
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
int data;
struct NODE *next;
}LinkList,*PLinkList;
void create_list(PLinkList *L,int n);
void insert_tail(PLinkList L,PLinkList node);
void insert_head(PLinkList L,PLinkList node);
void reverse_list(PLinkList L);
void print_list(PLinkList L);
void destroy_list(PLinkList *L);
void create_list(PLinkList *L,int n){
PLinkList node;
*L=(PLinkList)malloc(sizeof(LinkList));
(*L)->next=NULL;
while(n--){
node=(PLinkList)malloc(sizeof(LinkList));
node->next=NULL;
scanf("%d",&(node->data));
insert_tail(*L,node);
}
}
void insert_tail(PLinkList L,PLinkList node){
while((L->next)!=NULL)
L=L->next;
node->next=L->next;
L->next=node;
}
void insert_head(PLinkList L,PLinkList node){
node->next=L->next;
L->next=node;
}
void reverse_list(PLinkList L){
PLinkList p=(PLinkList)malloc(sizeof(LinkList));
PLinkList q;
p->next=L->next;
L->next=NULL;
while(p->next!=NULL){
q=p->next;
p->next=q->next;
insert_head(L,q);
}
free(p);
}
void print_list(PLinkList L){
if(L->next==NULL) printf("list is empty\n");
while((L=L->next)!=NULL){
if(L->next==NULL) printf("%d\n",L->data);
else printf("%d ",L->data);
}
}
void destroy_list(PLinkList *L){
PLinkList p;
while(((*L)->next)!=NULL){
p=*L;
*L=(*L)->next;
free(p);
}
free(*L);
}
int main()
{
PLinkList L;
int n;
while(scanf("%d",&n)!=EOF){
create_list(&L,n);
if(L->next!=NULL) print_list(L);
reverse_list(L);
print_list(L);
destroy_list(&L);
}
return 0;
}
bugs
Process terminated with status -1073741819
链表输出一直为空,闪退
尾插法节点插入函数出错,新增节点指向错误
error: expected declaration specifiers or '...' before '*' token
函数参数未标明形参类型
Process terminated with status -1073740940
函数处理一个测试用例后闪退
释放链表头节点出错,把头结点的地址释放了,下次就不可以调用了。
程序输出缺少空行
输出函数未打'\n'