数据结构基本代码2:线性链表的创建与节点的删除
2 posters
第1页/共1页
数据结构基本代码2:线性链表的创建与节点的删除
/* 创建一个链表,创建后删除链表中的某一个节点 */
#include "stdio.h"
#include "stdlib.h"
/*定义node结构体类型*/
typedef struct node
{
int data;
struct node *next;
}node;
void main()
{
node *p,*q; //定义两个node类型的指针,起辅助作用
node *head=(node *)malloc(sizeof(node)); //生成链表的头节点
int n; //变量n用于存放链表节点数;
int i,j,temp;
/*创建长度为n的链表*/
printf("请输入链表中节点的个数:"); //由用户输入链表的节点总数
scanf("%d",&n);
p=head; //指针p指向链表头节点
for(i=1;i<=n;i++) //用for循环创建n个节点
{
q=(node *)malloc(sizeof(node)); //生成新节点,其地址保存在指针q中
printf("请输入第%d个节点的值:",i); //由用户输入节点的data域值
scanf("%d",&temp);
/**/
q->data=temp; //将用户输入的值赋给节点的data域
p->next=q; //前一个节点的next域指向新节点
p=q; //辅助指针p移动到新生成的节点上
}
p->next=NULL; //将最后一个节点的next域设为空
/*输出创建好的链表*/
p=head->next; //p指向链表的第一个节点(不是头节点)
if(!p)
printf("此链表为空!");
else
{
i=1; //i用于辅助计数,当p指向地x个节点时,i的值为x;
while(p) //输出整个链表的所有节点值(不包含头节点)
{
printf("第%d个节点的值是:%d\n",i,p->data); //输出当前节点的data域值
p=p->next; //p指针移动到下一个节点
i++; //辅助变量i自增1
}
}
/*删除链表中的第j个节点*/
printf("请输入要删除的节点位置:"); //有用户给出要删除的节点位置
scanf("%d",&j);
p=head; //p指向第头节点
i=0; //辅助变量i为0
while(p&&i<j) //找到所要删除的第j个节点
{
if(i==j-1) //找到第j-1个节点时,用指针变量q保存下该节点地址。
q=p; //因为删除第j个节点,我们重点要对第j-1个节点进行一系列操作
p=p->next;
i++;
}
if(!p||i!=j) //判断是否找到了第j个节点。
{
printf("错误,您哟删除的节点位置超过节点总个数!\n");
return;
}
/*如果找到了第j个节点*/
q->next=p->next; //将第j-1个节点的next域指向第j个节点的下一个节点
free(p); //释放第j个节点
/*重新打印删除第j个节点后的链表*/
p=head->next;
if(!p)
printf("此链表为空!");
else
{ i=1;
while(p)
{
printf("第%d个节点的值是:%d\n",i,p->data);
p=p->next;
i++;
}
}
}
#include "stdio.h"
#include "stdlib.h"
/*定义node结构体类型*/
typedef struct node
{
int data;
struct node *next;
}node;
void main()
{
node *p,*q; //定义两个node类型的指针,起辅助作用
node *head=(node *)malloc(sizeof(node)); //生成链表的头节点
int n; //变量n用于存放链表节点数;
int i,j,temp;
/*创建长度为n的链表*/
printf("请输入链表中节点的个数:"); //由用户输入链表的节点总数
scanf("%d",&n);
p=head; //指针p指向链表头节点
for(i=1;i<=n;i++) //用for循环创建n个节点
{
q=(node *)malloc(sizeof(node)); //生成新节点,其地址保存在指针q中
printf("请输入第%d个节点的值:",i); //由用户输入节点的data域值
scanf("%d",&temp);
/**/
q->data=temp; //将用户输入的值赋给节点的data域
p->next=q; //前一个节点的next域指向新节点
p=q; //辅助指针p移动到新生成的节点上
}
p->next=NULL; //将最后一个节点的next域设为空
/*输出创建好的链表*/
p=head->next; //p指向链表的第一个节点(不是头节点)
if(!p)
printf("此链表为空!");
else
{
i=1; //i用于辅助计数,当p指向地x个节点时,i的值为x;
while(p) //输出整个链表的所有节点值(不包含头节点)
{
printf("第%d个节点的值是:%d\n",i,p->data); //输出当前节点的data域值
p=p->next; //p指针移动到下一个节点
i++; //辅助变量i自增1
}
}
/*删除链表中的第j个节点*/
printf("请输入要删除的节点位置:"); //有用户给出要删除的节点位置
scanf("%d",&j);
p=head; //p指向第头节点
i=0; //辅助变量i为0
while(p&&i<j) //找到所要删除的第j个节点
{
if(i==j-1) //找到第j-1个节点时,用指针变量q保存下该节点地址。
q=p; //因为删除第j个节点,我们重点要对第j-1个节点进行一系列操作
p=p->next;
i++;
}
if(!p||i!=j) //判断是否找到了第j个节点。
{
printf("错误,您哟删除的节点位置超过节点总个数!\n");
return;
}
/*如果找到了第j个节点*/
q->next=p->next; //将第j-1个节点的next域指向第j个节点的下一个节点
free(p); //释放第j个节点
/*重新打印删除第j个节点后的链表*/
p=head->next;
if(!p)
printf("此链表为空!");
else
{ i=1;
while(p)
{
printf("第%d个节点的值是:%d\n",i,p->data);
p=p->next;
i++;
}
}
}
- 附件
第1页/共1页
您在这个论坛的权限:
您不能在这个论坛回复主题