伤不起的指针
虽然知道怎么做,但是还是做一遍啦。结果调试了两个多小时,真崩溃。
/*
* =====================================================================================
*
* Filename: intlist.h
*
* Description:
*
* Version: 1.0
* Created: 09/16/2011 02:56:13 AM
* Revision: none
* Compiler: gcc
*
* Author: YOUR NAME (),
* Company:
*
* =====================================================================================
*/
#include <stdio.h>
#include <stdlib.h>
struct list_node
{
int data;
struct list_node *next;
};
struct list_node * make_node(int n)
{
struct list_node *pNode = (struct list_node *)malloc(sizeof(struct list_node ));
pNode->next = 0;
pNode->data = n;
return pNode ;
}
void put_node(struct list_node *pNode)
{
free(pNode);
}
struct list
{
struct list_node *head;
};
void CreateNoHead(struct list *root,int arrary[],int n)
{
struct list_node ** ppHead = &(root->head);
struct list_node * pNode ;
for(int i = 0; i< n ;++i)
{
pNode = make_node(arrary[i]);
/*if(!*ppHead)
{
*ppHead = pNode;
}else{
pNode->next = (*ppHead);
*ppHead = pNode;
}
*/
if(*ppHead)
pNode->next = (*ppHead);
*ppHead = pNode;
printf("%d\t",pNode->data);
}
printf("\n");
fflush(stdin);
}
void CreateHead(struct list *root,int arrary[],int n)
{
root->head = make_node(0);
struct list_node * pHead = root->head;
struct list_node * pNode ;
for(int i = 0; i< n ;++i)
{
pNode = make_node(arrary[i]);
/*
if(*head)
{
pNode->next = (*head)->next;
(*head)->next = pNode;
}
else//root->head = null
pNode->next = *head;
*head = pNode;
*/
//先进后出链表
pNode->next = pHead->next;
pHead->next = pNode;
printf("%d\t",pNode->data);
}
printf("\n");
fflush(stdin);
}
void Print(const struct list *root)
{
struct list_node * pNode = root->head;
while(pNode)
{
printf("%d\t",pNode->data);
pNode = pNode->next;
}
printf("\n");
fflush(stdin);
}
void Destroy(struct list *root)
{
struct list_node * pNode = root->head;
struct list_node * pNext;
while(pNode)
{
pNext = pNode->next;
put_node(pNode);
pNode = pNext;
}
}
void ReverseHead(struct list *root)
{
struct list_node * pHead = root->head->next;
struct list_node * pNode ;
struct list_node * pNext ;
if(!pHead ||!(pNode = pHead->next))
return ;
//伤不起啊,该处要赋值为空
pHead->next = 0;
while(pNode)
{
pNext = pNode->next;
pNode->next = pHead;
pHead = pNode;
pNode = pNext;
}
//重新赋值
root->head->next = pHead;
}
void ReverseNoHead(struct list *root)
{
struct list_node * pHead = root->head;
struct list_node * pNode ;
struct list_node * pNext ;
//链表只有一个或零个节点
if(!pHead ||!(pNode = pHead->next))
return ;
pHead->next = 0;
while(pNode)
{
pNext = pNode->next;
//插入
pNode->next = pHead;
pHead = pNode;
pNode = pNext;
}
//head重新赋值,新的表头
root->head = pHead;
}
void TestNoHead(struct list *root)
{
}
void TestHead(struct list *root)
{
}
int main(int argc,char *argv[])
{
int arrary [] = {1,2,3,4,5,6,7,8,9,10};
struct list task;
task.head = 0;
CreateHead(&task,arrary,sizeof(arrary)/sizeof(int));
//CreateNoHead(&task,arrary,sizeof(arrary)/sizeof(int));
Print(&task);
printf("\n");
//Reverse(&task);
//ReverseNoHead(&task);
ReverseHead(&task);
Print(&task);
Destroy(&task);
return 0;
}