私信TA

用户名:chenqi

访问量:37158

签 名:

等  级
排  名 321
经  验 5453
参赛次数 0
文章发表 52
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

后缀表达
浏览:1419
C语言整理(part1)
浏览:770
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//定义一个结点,可视为链表的最小单元,包括两要素:指针域和数据域
typedef struct Node
{
    struct Node *link;
    int num;
} node,*pNode;

pNode Del_Node(pNode pHead,int back);
node * creat(int n) /*建立单链表,n为链表中结点的个数*/
{
    node *pTail = NULL,*pHead = NULL,*pNew = NULL; 
//为了记住链表的起始地址,设置根指针*pHead保存表头结点的指针
//头指针指向链表的第1个节点,他只是一个指针,不包含任何数据
//*pTail尾节点,*pNew新结点
    int i; 
 
//线性表初始化,设置头结点,并使尾结点指向头结点
    if((pHead = (node *)malloc(sizeof(node)))==NULL) /*分配新存储空间并检测,一个结点*/
    {
            printf("不能分配内存空间!");
            exit(0);
    }
 
    pHead->num=0; /*把表头结点的数据域置空*/
    pHead->link=NULL; /*把表头结点的链域置空,此时还未插入任何数据*/
    pTail=pHead; /*pTail指向表头结点*/

//插入结点的步骤:
//1.生成新的结点,注意新结点的link指向NULL;
//2.将新结点添加到表尾;
//3.设置新的表尾
    for(i=1;i<=n;i++)//插入n个节点
    {
        if((pNew = (node *)malloc(sizeof(node)))==NULL) /*分配新存储空间并检测*/
        {
            printf("不能分配内存空间!");
            exit(0);
        } 
		
		pNew->num = i;
//实现循环链表
		if(i < n)
		{
			pNew->link=NULL;
		}
		else
		{
			pNew->link=pHead->link;//注意头结点没有数据
		}
		pTail->link=pNew; //新结点插到表尾
		pTail=pNew;//设置新的表尾
    }
    return pHead;
}
 
void output(node *p)
{
	int i=0;
    for(i=0;i<20;i++)
	{
		printf("%d ",p->num);
        p= p->link;
	}      
}
 
int main()
{
    pNode p,tmp;
    p = creat(10)->link;//返回值为头指针

	Del_Node(p,3);		
	output(p);
	while(1);
    return 0;
}

//删除单个结点
pNode Del_Node(pNode pHead,int back)
{
    int i = 1;
    pNode _node = pHead;
    pNode pTmp;
    if ((back < 1) && (NULL == _node->link))	//非空链表
    {
        printf("删除失败!\n");
        return 0;
    }


    while(i < back-1)	//找到待删除结点的前一个结点
    {
		_node = _node->link;
        ++i;
    }

    pTmp = _node->link;	
    _node->link = _node->link->link;
    free(pTmp);	//删除结点
    return _node; 
}


 

0.0分

0 人评分

  评论区

谢谢
2017-11-22 22:02:55
进步很大啊
2017-11-22 20:53:32
  • «
  • 1
  • »