单链表

#include "Stdio.h"
#include "Conio.h"
#include <malloc.h>

typedef struct node
{
    int data;
    node *next;
}node;

node *create()
{
    int i = 0;
    node *head, *p, *q;

    int x = 0;
    head = (node*)malloc( sizeof(node) );

    while(1)
    {
        printf("Please input the data:");
        scanf("%d",&x);

        if(x == 0)
            break;

        p = (node *)malloc( sizeof(node) );
        p->data = x;

        if(++i == 1)
        {
            head->next = p;
        }
        else
        {
            q->next = p;
        }
        q = p;
    }
    q->next = NULL;
    return head;
}

int length(node *head)
{
 int len = 0;
 node *p;
 p = head->next;
 while(p != NULL)
 {
  len ++;
//  printf("Data: %d/n", p->data);
  p = p->next;
 }
 return len;
}

void print(node *head)
{
// printf("The data of link/n--------------------------------------------------------------------------/n");
 node *p;
 int index = 0;

 if(head->next == NULL)
 {
  printf("Link is empty!/n");
  return;
 }

 p = head->next;
 while(p!= NULL)
 {
  printf("The %dth node is: %d/n", ++index, p->data);
  p = p->next;
 }
// printf("--------------------------------------------------------------------------/n");
}

node *search_node(node *head, int pos)
{
 node *p = head->next;
 if(pos < 0 )
 {
  printf("Incorrect position to search node!/n");
 }
 
 if(pos == 0)
 {
  return head;
 }

 if(head->next == NULL)
 {
  printf("Link is empty!/n");
  return NULL;
 }

 while(--pos)
 {
  if( (p = p ->next) == NULL)
  {
   printf("Incorrect position to search node!/n");
   break;
  }
 }

 return p;
}

node *insert_node(node *head, int pos, int data)
{
 node *p;
 node *item = NULL;
 item = (node*) malloc( sizeof(node) );
 item->data = data;

 if(pos == 0)
 {
  head->next = item;
  return head;
 }

 p = search_node(head, pos);

 if( p!=NULL)
 {
  item->next = p->next;
  p->next = item;
 }

 return head;
}

node *delete_node(node *head, int pos)
{
 node *p;
 p = head->next;

 if( p==NULL )
 {
  printf("Link is empty!/n");
  return NULL;
 }

 p = search_node(head, pos);
 
 if(p != NULL && p->next != NULL)
 {
  p->next = p->next->next;
 }

 return head;
}

node *reverse(node *head)
{
 node *p;
 node *q;
 node *r;

 if(head->next == NULL)
 {
  return head;
 }

 //断开连接
 p = head->next;
 q = p->next;
 p->next = NULL;

 while(q != NULL)
 {
  r = q->next;
  q->next = p;
  p = q;
  q = r;
 }

 head->next = p;

 return head;
}

node *search_middle(node *head)
{
 int len = length(head);
 int mid = len/2;
 node *mid_node = NULL;
 mid_node = search_node(head, mid);

 printf("The Fuction middle of the Link: %d/n", mid_node->data);
 return mid_node;
}

node *search(node *head)
{
 int i = 0;
 int j = 0;
 node *current = NULL;
 node *middle = NULL;

 current = middle = head->next;

 while(current != NULL)
 {
  if( i/2>j)
  {
   j++;
   middle = middle->next;
  }
  i++;
  current = current->next;
 }

 printf("The middle of the Link: %d/n", middle->data);
 return middle;
}

node *sort(node *head)
{

 if(head->next == NULL)
 {
  printf("Link is empty!/n");
  return head;
 }

 node *o = head;
 node *temp = head;
 node *p = o->next;
 node *q = p->next;
 node *end = NULL;

 while( temp != NULL)
 {
  o = head;
  p = o->next;
  q = p->next;
  while(q != end)
  {
   if( p->data > q->data)
   {
    p->next= q->next;
    q->next = p;
    o->next = q;
   }

   o = o->next;
   p = o->next;
   q = p->next;
  }
  end = p;
 // printf("/n------------------END: %d------------------------/n", end->data);
 // o = temp->next;
  temp = temp->next;
 }

 return head;
}


int main(void)
{
 printf("/n------------------------------------------/n");
 printf("          单链表演示程序    /n");
 printf("------------------------------------------/n/n");
 
    node *head = create();
 printf("/n/n/nLength: %d/n", length(head) );
 print(head);

 head = insert_node(head, 2, 11);
 printf("/nAfter the insert data of link/n--------------------------------------------------------------------------/n");
 print(head);

 head = delete_node(head, 2);
 printf("/nAfter the delete data of link/n--------------------------------------------------------------------------/n");
 print(head);

 head = reverse(head);
 printf("/nAfter the reverse data of link/n--------------------------------------------------------------------------/n");
 print(head);

 search(head);
 search_middle(head);

 head = sort(head);
 printf("/nAfter the sort data of link/n--------------------------------------------------------------------------/n");
 print(head);

    getch();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值