#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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复