zoukankan      html  css  js  c++  java
  • 名单(两)——基本操作单向链表(创、删、印、节点统计数)

    1.指针联动
    通过两个指针指向前任和后继节点,而移动一个单向链表,当被处理的指针的节点,节点的前体也有一个指针。
    2.有一种无序单向链表。和数据字段值不一样。指针pmin最小点值节点,和指针prem最小点值结点的前驱结点:
    代码片段:
    for(p = head; p; q = p, p = p->next)
    {
        if(pmin->data > p->data)
        {
            pmin = p;
            prem = q;
        }
    }
    3.单向链表的删除算法
    注:使用malloc函数分配的结点单元必须使用free函数来释放。free(p)之后,p所指向的单元被释放。p被系统又一次赋值为随机值,p仅仅能在程序执行完毕之后自己主动清除。
    头结点的删除:head = head->next;free(pdel);
    非头结点的删除:ppre->next = pdel->next;free(pdel);
    4.样例
    注:单向链表的最主要的操作,新建一个链表、删除一个元素、打印链表、统计链表的个数、删除链表。

    #include <stdio.h>
    #include <malloc.h>
    
    #define NULL	0
    
    typedef struct node {
    	int data;
    	struct node *next;
    }ElemSN;
    
    
    ElemSN * creat_link(int ms); //逆向创建一个链表
    void print_link(ElemSN *head); //输出单向链表
    ElemSN * delete_node(ElemSN *head, int x); //删除链表中的一个结点
    int count_link(ElemSN *head); //统计单向链表结点的个数
    ElemSN * clear_link(ElemSN *head); //删除链表
    
    int main()
    {
    	ElemSN *head;
    	int ms, x;
    
    	printf("Please input node number:");
    	scanf("%d", &ms);
    	head = creat_link(ms);
    	print_link(head);
    	printf("Please input delete node:");
    	scanf("%d", &x);
    	head = delete_node(head, x);
    	print_link(head);
    	printf("link member is :%d
    ", count_link(head));
    	head = clear_link(head);
    }
    
    ElemSN * creat_link(int ms)
    {
    	ElemSN *h = NULL, *p;
    	int i, x;
    
    	for(i = 0; i < ms; i++)
    	{
    		printf("Please input data:");
    		scanf("%d", &x);
    		p = (ElemSN *)malloc(sizeof(ElemSN));
    		p->data = x;
    		p->next = h;
    		h = p;
    	}
    
    	return h;
    }
    
    void print_link(ElemSN *head)
    {
    	for(; head; head = head->next)
    	{
    		printf("%d ", head->data);
    	}
    	printf("
    ");
    }
    
    ElemSN * delete_node(ElemSN *head, int x)
    {
    	ElemSN *p = NULL, *q = NULL;
    	
    	if(NULL == head)
    	{
    		return NULL;
    	}
    	for(p = head; p && p->data != x; q = p, p = p->next); //p && p->data != x不能交换位置
    
    	if(NULL == p) //没有找到要删除的结点
    	{
    		return head;
    	}
    
    	if(NULL == q) //要删除的是头结点
    	{
    		head = head->next;
    	}
    	else
    	{
    		q->next = p->next;
    	}
    	free(p);
    
    	return head;
    }
    
    int count_link(ElemSN *head)
    {
    	int count = 0;
    	
    	for(; head; count++, head = head->next);
    
    	return count;
    }
    
    ElemSN * clear_link(ElemSN *head)
    {
    	ElemSN *p;
    
    	while(head)
    	{
    		p = head->next;
    		free(head);
    		head = p;
    	}
    
    	return head;
    }

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4835185.html
Copyright © 2011-2022 走看看