直接上代码:
//单链表的建立,节点赋值,输出,插入,整表删除,指定节点位置删除
#include <stdio.h>
#include <stdlib.h>
#define N 15
struct student{
int date;
struct student *next;
}; //节点结构体
/***********************************************
单链表的创建函数:
节点个数:1个头节点+n个子节点一共n+1个节点
头结点数据域存放子节点个数,子节点数据域默认为0
***********************************************/
struct student *creat(unsigned int n)
{
struct student *head,*p,*s;
head=p=s=NULL;
int i=0;
if((head=(struct student*)malloc(sizeof(struct student)))==NULL)
{
printf("head创建失败\n");
return NULL;
}
head->date=n;
s=head;
for(i=0;i<n;i++)
{
if((p=(struct student*)malloc(sizeof(struct student)))==NULL)
{
printf("第%d个节点创建失败\n",i+1);
return NULL;
}
s->next=p; //保存下一个节点的指针域
s=p; //移动到最后一个节点
s->date=0; //数据域初始值默认为0
}
s->next=NULL;
return head; //返回头节点指针
}
/***********************************************
链表的整表删除函数:
删除 n+1个节点
***********************************************/
void DeList(struct student *p) //删除以p为头结点的链表
{
struct student *s=NULL;
while(p!=NULL)
{
s=p;
p=p->next; //p指针指向下一个节点
free(s); //删除s节点
}
}
/***********************************************
单节点删除函数:
删除第 n个节点后的 m 个节点
从 n节点后删除 m个节点
***********************************************/
void Del(struct student *list,int n,int m)
{
struct student *s=NULL,*p=NULL,*pt=NULL;
int i=0;
list->date=list->date-m;
for(i=0;i<n;i++)
{
s=list->next;
}
p=s->next;
for(i=0;i<m;i++)
{
pt=p->next;
free(p);
p=pt;
}
if(m+n==5) //删除到 最后一个节点
{
s->next=NULL;
}
else
{
s->next=p;
}
}
/***********************************************
链表输出函数:
输出链表头结点以及各个子节点的数据域以及指针域
***********************************************/
void print(const struct student *p)
{
int i=0;
int len=p->date;
printf("该链表除去头结点共有%d个子节点\n",p->date);
for(i=0;i<len;i++)
{
p=p->next;
printf("第%d个子节点 date:%d next:%p\n",i+1,p->date,p->next);
}
}
/***********************************************
链表输入函数:
将链表第n个位置后的m个节点以数组a中数据赋值到节点的数据域
***********************************************/
void scan(struct student *list,int n,int m,const int a[])
{
int i=0;
struct student *p=NULL,*s=NULL;
if(m+n>list->date)
{
printf("写入数据个数超过节点个数\n");
return ;
}
s=list;
for(i=0;i<n;i++) //将s指针移动到第n个节点处
{
s=s->next;
}
s=s->next; //s节点指针指向将要赋值的节点
for(i=0;i<m;i++)
{
s->date=a[i];
s=s->next;
}
}
/***********************************************
链表插入函数:
在链表第n个位置后插入m个节点
***********************************************/
void insertion(struct student *list,int n,int m ) //在第n个节点后面插入m个节点
{
struct student *p=NULL,*s=NULL,*pt;
int i=0;
if(n>list->date)
{
printf("插入位置大于链表节点个数\n");
return ;
}
pt=list;
for(i=0;i<n;i++)
{
pt=pt->next; //移动到第n个节点处
}
s=pt->next;
for(i=0;i<m;i++)
{
if((p=(struct student *)malloc(sizeof(struct student)))==NULL)
{
printf("节点创建失败\n",i+1);
return ;
}
p->date=0;
pt->next=p;
pt=p;
list->date++;
}
pt->next=s;
}
int main(int argc, char *argv[])
{
struct student *str=NULL;
int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
str=creat(N); // 创建N个节点的单链表返回头节点指针
scan(str,5,10,a);
insertion(str,2,3); //在第二个节点后插入子节点
print(str); //输出链表信息
Del(str,5,3); //第五个节点后删除3个节点
print(str); //输出链表信息
DeList(str); //删除链表
return 0;
}
int main(int argc, char *argv[])
{
struct student *str=NULL;
int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
str=creat(N); // 创建N个节点的单链表返回头节点指针
scan(str,5,10,a);
insertion(str,2,3); //在第二个节点后插入子节点
print(str); //输出链表信息
Del(str,5,3); //第五个节点后删除3个节点
print(str); //输出链表信息
DeList(str); //删除链表
return 0;
}
测试环境dev c++: