动态链表的相关操作

1.结构体 

        链表是一种常见的数据结构,主要由若干个结点构成,结点包含一些数据信息及下一个结点的地址。分析可知结点中各成员的数据类型是不同的,声明一个结构体类型将不同类型的数据组合起来,这样每一个结点都可以看成是一个结构体变量。简单举例、代码如下:将一个整型和结构体指针类型组合形成的结构体类型。

struct Person //声明一个结构体类型struct Person
{
  int num;    //整型变量num,用于存放结点信息
  struct Person *next;	//结构体指针next,用于存放下一结点地址
};

2.创建动态链表

        动态链表的创建需要利用malloc()、calloc()函数进行动态的内存分配。代码如下:

struct Person *p1,*p2,*head;     //定义结构体指针
p2=p1=(struct Person *)malloc(sizeof(struct Person)); 
//动态分配了sizeof(struct Person)大小的空间,用结构体指针p指向该分配区域的开头位置。

       若将此结点作为头结点,继续用动态分配函数开辟结点,用上一个结点的结构体指针成员指向新开辟的结点地址;当最后一个结点建好后,只需令最后一个结点的结构体指针成员指向NULL,即可完成链表创建。

 	if(n==1) head=p1;//如果是第一个结点,就用头指针指向该结点。
 	else p2->next=p1;//如果不是,就将当前链表的nest成员指向新开辟的结点。

3.动态链表插入结点

1.先动态开辟一个结点,写入相关数据信息。

struct Person *p;//定义结构体指针
p=(struct Person *)malloc(struct Person);//动态开辟一个sizeof(struct Person)大小的空间
scanf("%d",&(p->num));//新开辟结点中写入数据信息

2.定义两个结构体指针变量指向链表的表头。定义两个整型变量,一个用于循环移动结构体指针指向,一个用于输入插入结点的位置。

struct Person *p1,*p2;
p2=p1=head;
int i,j;

3.判断要插入结点的位置:

<1>插入表头位置:
	p->next=head;//新结点成员next指向原来的表头。
	head=p;      //头指针指向新结点。
<2>插入表尾位置:
		for(j=1;j<n;j++) p1=p1->next;//利用循环使p1指向原链表最后一个结点。
		p1->next=p;                  //原表尾成员next指向新开辟的结点p。
		p->next=NULL;                //将NULL赋给新开辟的结点成员next,使新结点成为新的表尾结点。
<3>插入其他位置:
		for(j=1;j<i-1;j++) p2=p1=p1->next;//利用循环使p1、p2指向目标位置的前一个结点。
		p2=p2->next;                      //p2指向原目标位置的结点。
		p1->next=p;                       //p1指向的结点成员next指向新开辟的结点。
		p->next=p2;                       //新开辟的结点成员next指向原目标位置的结点。

4.动态链表删除结点

1.定义两个结构体指针变量指向链表的表头。定义两个整型变量,一个用于循环移动结构体指针指向,一个用于输入删除目标结点的位置。

struct Person *p,*p1;  
p1=p=head;             
int i,j;               

2.判断要删除目标结点的位置:

<1>删除表头结点:
head=head->next;//将头指针指向原链表第二个结点。
p->next=NULL;   //原头结点成员next置空。
<2>删除表尾结点:
for(j=1;j<n-1;j++) p=p->next;//利用循环,移动结构体指针变量p,使其指向倒数第二个结点。
p->next=NULL;                //将NULL赋给倒数第二个结点成员next,使当前结点成为表尾结点。
<3>删除其他结点:
for(j=1;j<i-1;j++) p1=p=p->next;//利用循环,将结构指针p、p1移动至目标结点的前一个结点。
p1=p1->next;                    //p1指向要删除的结点。
p->next=p1->next;               //前一个结点的结构体成员next,跳过删除的结点指向下个结点。
p1->next=NULL;                  //将NULL赋给要删除的结点成员next。

4.输出链表

struct Person *p;//定义结构体指针p。
p=head;          //结构体指针p指向头指针。
if(p!=NULL)      //如果链表不为空。
do
{
  printf("%d ",p->num);//输出当前结点成员num。
  p=p->next;           //p指向下一结点。
}while(p!=NULL);       //当p=NULL输出完成。

 5.程序运行结果

        了解以上链表的创建、输出,结点的插入、删除相关操作后。利用模块化编程,按功能编写函数,主函数调用这些函数模块,完成链表的相关操作。

https://item.taobao.com/item.htm?id=827303984397

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值