#include <stdio.h>
#include <stdlib.h>
typedef struct Node //定义一个结构体类型Node //链表结点
{
int data; //数据域:存放数据
struct Node *next; //指针域,指针变量 :存放地址
}N,*P; //用typedef给结构体类型Node取了一个别名 N, 给struct Node*类型取了一个别名P
P create(void){ //创建头结点
P head = (P)malloc(sizeof(N)); //malloc函数动态分配内存 ,新建一个头指针等价于:struct Node head = (struct node*)malloc(sizeof(struct Node))
if(head == NULL){
printf("分配内存失败,程序退出\n");
exit(-1);
}
head->next = NULL;
return head;
}
void input(P head,int value){ //在链表最后增加一个结点
P last = (P)malloc(sizeof(N));
if(last == NULL){
printf("分配内存失败,程序退出\n");
exit(-1);
}
last->data = value;
last->next = NULL;
while(head->next != NULL) //将头指针指向尾结点
head = head->next;
head->next = last; //将尾节点的指针域指向新建的尾结点(尾插法)
}
void show(P head){ //输出所有结点元素
while(head!= NULL){
printf("%d\n",head->data);
head = head->next; //指向下一个结点
}
}
int len(P phead){ //计算有效节点的个数
int i;
for(i= 0;phead->pnext != NULL;++i)
phead = phead->pnext;
return i;
}
_Bool del(P phead,int index){ //删除某个有效节点 把以 phead为头指针的链表 中的第index个节点删除
int i;
if(index <= 0 || index >len(head)) //无效结点
return -1;
for(i=1;i<index;++i) //将头指针移动到所删除结点的前一个结点位置
head = head->next;
P tail = head->next->next; //保存所删除结点的下一个结点的指针
free(head->next); //释放所删除结点的指针
head->next = tail;
return 1;
}
_Bool insert(P head,int index,int value){ //插入一个节点 (头指针,插入的位置,新建节点的data的值 )
int i;
if(index <= 0 || index > len(head)+1)
return -1;
P pw = (P)malloc(sizeof(N)); //新建节点
if(pw == NULL){
printf("分配内存失败,程序退出\n");
exit(-1);
}
pw->data = value; //内存分配成功,将value的值赋给新建节点的data
for(i=1;i<index;++i)
head = head->next; //所要插入的节点的上一个节点的位置
pw->next = head->next; //插入位置的下一个结点指针赋给新建结点指针域
head->next = pw; //新建结点的指针域赋值给头节点
}
void invert(P head){ //链表倒置
if(head->next == NULL){
return;
}
P p0 = head->next; //保存第一个有效结点地址
P p1 = p0->next; //保存第一个有效节点的next的值 (第二个结点的地址)
P p_0 = p0,p2;
while(p1 != NULL){ //链表有第二个有效结点
p2 = p1->next; //先保存第二个有效节点的指针域
p1->next = p0; //再将第二个结点指向前一个结点
p0 = p1;
p1 = p2;
}
head->next = p0;
p_0->next = NULL;
}
int main(void){
P head = create();
input(head,1);
input(head,2);
input(head,3);
input(head,4);
// del(head,2);
// insert(head,2,10);
invert(head);
show(head);
printf("有效节点的个数为%d",len(head));
return 0;
}
单向动态链表(建立,尾插,删除,输出,插入,倒置)
最新推荐文章于 2023-07-10 18:53:58 发布