#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node, *LinkList;
//链表初始化,尾插法
LinkList CreateListTail(LinkList *L){
int num;
LinkList p,r;
*L = (LinkList)malloc(sizeof(Node));//头节点的值
r = *L;//头节点赋值给r,r为last
printf("please input nums(end 0f 0):");
while(1){
scanf("%d", &num);
if(num == 0){
return 0;
}else{
p = (LinkList)malloc(sizeof(Node));
p->data = num;
r->next= p;
r = p;
}
}//循环结束后r为最后一个结点
r->next = NULL;
return *L;
}
//获取L中第i个数据元素的值,将结果返回给e
int GetElem(LinkList L, int i, int *e){
int cnt = 1;
LinkList p;
p = L->next;//p为第一个节点(不是头节点)
while(p && cnt < i){
p = p->next;
cnt++;
}
if(p){
*e = p->data;
printf("第%d个节点上的值为%d\n", i, *e);
}else{
printf("节点不存在\n");
}
return 0;
}
//插入一个节点
int ListInsert(LinkList *L, int i, int e){
int cnt = 1;
LinkList p;
p = *L;//p为头节点
while(p && cnt < i){
p = p->next;
cnt++;
}
if(!p && cnt > i){
return 0;
}
LinkList s = (LinkList)malloc(sizeof(Node));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
//删除一个节点,并将结果返回给e
int ListDelete(LinkList *L, int i, int *e){
LinkList p, s;
int j = 1;
p = *L;
while(p->next && j < i){
p = p->next;
j++;
}
if(!(p->next) || j > i){
return 0;
}else{
s = p->next;
p->next = s->next;
*e = s->data;
free(s);
return 1;
}
}
int main()
{
LinkList L;
int i;
int e;
printf("链表初始化,尾插法\n ");
CreateListTail(&L);
printf("请输入一个数i,获取第i个元素的数据:");
scanf("%d", &i);
GetElem(L, i, &e);
printf("插入一个新节点,请输入节点位置和值:");
scanf("%d%d", &i, &e);
if(ListInsert(&L, i, e)){
printf("插入成功\n");
}else{
printf("插入失败\n");
}
GetElem(L, i, &e);//查询插入是否符合预期
printf("删除一个节点,请输入节点的位置:");
scanf("%d", &i);
if(ListDelete(&L, i, &e)){
printf("删除成功\n");
printf("被删除的值为%d\n", e);
}else{
printf("删除失败\n");
}
}
链表的增删改查
最新推荐文章于 2024-09-29 15:26:10 发布