一夜北风紧

导航

创建单向动态链表、插入链表、删除链表

今天学习了链表,并用哑结点(dummy node)对链表做了点优化。

 

#include <stdio.h>

typedef struct S_NODE *Link;//一种约定定义,用typedef允许定义指针时,
    //它允许利用此语句后面定义的类型

struct S_NODE          //定义一种结构体存放链表元素
{
 int x;
 Link next;
};   

Link Init()
{
 Link head;//dummy link
 head = (Link)malloc(sizeof(struct S_NODE));
 head->next = NULL;
 return head;
}
void Add(Link head, Link next)
{
 Link t = head;
 while (t->next)
  t = t->next;
 next->next = t->next;
 t->next = next;
}
void Del(Link head, int num)
{
 Link p1,p2;
 p1 = p2 = head; //需要记录被删结构的上一个元素,
   //然后把将要被删元素的下一个元素给前一个元素的next,
   //就是替代被删元素的位置
 while(p1->x != num && p1->next != NULL)
 {
  p2 = p1;
  p1 = p1->next; 
 }
 if(num == p1->x)   
 { if(p1 == head)
   head = p1->next;
  else
   p2->next = p1->next;
  free(p1);  
 }
 else
  printf("NO Node!\n"); 
 
}


void Free(Link head)
{
 Link t;
 t = head->next;
 while(t->next != NULL)//删除哑结点下一个元素,将下下元素的结点放哑结点内
 {
  head->next = t->next;
  free(t);
  t = head->next;
 }
 free(t);  //链表的最后一个元素
 free(head); //哑结点
}

int main()
{
 Link head, t;
 int i;
 head = Init();
 for (i = 0; i < 50;i++)
 {
  t = (Link)malloc(sizeof(struct S_NODE));
  t->x = i;
  Add(head, t);
 }
 t = head;
 for (i = 0; i < 50;i = i+2)
  Del(t,i);  
 t = head->next;
 while(t)
 {

  printf("%d\t", t->x);
  t = t->next;
 }
 Free(head);
 printf("END\n");
 return 0;
}

posted on 2010-10-15 21:45  北风紧  阅读(1355)  评论(0编辑  收藏  举报