单向链表实现反转

来源:互联网 发布:2017淘宝捉猫猫技巧 编辑:程序博客网 时间:2024/05/21 04:26

前沿:用单向链表实现了队列的插入和删除操作。并且实现了队列的反串。

#include <stdio.h>
#include <stdlib.h>
struct Node
{
 int data;
 struct Node *next;
};
struct List
{
 struct Node *head;
 struct Node *rear;
 unsigned int NodeNumber;
};
bool revers(List *ListNode);
void creat_list(List *ListNode)
{
 ListNode->head = NULL;
 ListNode->rear = NULL;
 ListNode->NodeNumber = 0;
}
bool AddNode(unsigned int NodeData, List *ListNode)
{
 Node *AddData = (Node *)malloc(sizeof(Node));
 AddData->data = NodeData;
 AddData->next = NULL;
 if(ListNode == NULL)
 {
  return false;
 }
 else
 {
  if(ListNode->NodeNumber == 0 )
  {
   ListNode->head = AddData;
  }
  else
  {
   ListNode->rear->next = AddData;
  }
  ListNode->rear = AddData;
  ListNode->NodeNumber++;
 }
 return true;
}
//实现的是队列,先进先出的操作
bool DelNode(unsigned int *NodeData,List *ListNode)
{
 Node *DelAddress = NULL;
 if( 0 == ListNode->NodeNumber ||  NULL==ListNode)
 {
  return  false;
 }
 else
 {
   ListNode->NodeNumber--;
  *NodeData = ListNode->head->data;
         DelAddress = ListNode->head;
   ListNode->head = ListNode->head->next;
   free(NodeData);
 }
 return true;
}

void main()
{
 List TextList;
 Node now;
 unsigned int AddDeldata = 0;
 creat_list(&TextList);
 printf("input a data to add list\n");
 scanf("%d",&AddDeldata);
 while((9>AddDeldata)&&(AddDeldata>0))
 {
  AddNode(AddDeldata, &TextList);
  scanf("%d",&AddDeldata);
 }
 revers(&TextList);
 now = *(TextList.head);
 while ( now.next != NULL)
 {
  printf("%d\n",now.data);
  now = *(now.next);
 }
 printf("%d\n",now.data);
}

bool revers(List *ListNode)
{
 Node *front,*middle,*last;
 front  = ListNode->head;
 ListNode->rear = front;
 middle = front->next;
 last   = middle->next;
 if (front==NULL)
 {
  return false;
 }
 if(middle==NULL)
 {
  return true;
 }
 front->next = NULL;
 while (last != NULL)
 {
  middle->next = front;

  front = middle;
  middle = last;
  last = last->next;
 }
 middle->next = front;
 ListNode->head = middle;
 return true;
}

 

原创粉丝点击