#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
谢谢
进步很大啊