标题: 单向链表结点的逐个删除-C语言教程 [打印本页]

作者: 51黑ren    时间: 2015-12-20 02:48
标题: 单向链表结点的逐个删除-C语言教程
      每敲一次代码都会有新的收获,基本功不扎实啥也干不了。单向链表的插入,删除,创建,遍历是数据结构的基本操作。里边的算法值得学习。

源码:
/*
先创建一个单向链表,然后从头结点开始逐个删除。
*/

#include"stdio.h"
#include"stdlib.h"
//声明一个结点,实际上就是定义一个数据结构
struct node{
  int num;
  node *next;

};
//创建链表
node *creatlist()
{
        int i=0;//统计创建结点个数
    node *head,*p2,*p1;//p2用来传递结点指针
    head=p2=p1=new node;
        printf("请输入头结点数据域数据:\n\r");
        scanf("%d",&p1->num);
    p1->next=NULL;
        while(p1->num!=0)
        {
                p1=new node;
                scanf("%d",&p1->num);
                p2->next=p1;//头结点指针指向新创建的结点
            p2=p1;
            i++;
        }
        p2->next=NULL;//链表尾结点
    printf("创建的结点数是:%d\n",i);
        return head;
}

void display(node *head)
{
        node *p=head;
    while(p->next!=NULL)
        {
          printf("%d\t",p->num);
          p=p->next;
       
       
        }
   printf("\n");

  
}

//从头结点开始删除整个链表
void remove(node *head)
{
    int i=0;//统计删除结点个数
  //通过这两个指针的移动实现整个链表结点逐个删除,  
  node *p,*p1;//也就是说本函数只需轮流使用这两个指针移动就能实现遍历链表
   p=head;  //存储头指针,
   p1=p->next; //存储头结点指针域
   while(p->next!=NULL)//通过循环逐个删除结点
   {
      //刚开始p指向head,即p存储了头结点head本身的指针,即p就是头结点指针
       delete p;//通过这一步释放p所指向的内容,即删除头结点内容
           i++;
       p=p1;//p指向p1即下一个结点,这时p1成为新链表的头指针,因为之前的头结点已经删除
           //p1原来指向头结点的下一个结点
           p1=p1->next;//通过此步,p1指针重新指向,指向下一个结点实现指针移动
   }
  delete p;//将最后一个结点删除

  printf("删除结点个数: %d\n",i);

}

void main()
{
        node  *head=creatlist();
    display(head);
    remove(head);
  
}

--------------GKXW








欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1