虽然知道怎么做,但是还是做一遍啦。结果调试了两个多小时,真崩溃。
/* * ===================================================================================== * * Filename: intlist.h * * Description: * * Version: 1.0 * Created: 09/16/2011 02:56:13 AM * Revision: none * Compiler: gcc * * Author: YOUR NAME (), * Company: * * ===================================================================================== */ #include#include 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; }