C语言---实现单链表的插入和删除操作
程序员文章站
2022-05-06 09:45:26
...
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
LinkList L;//全局变量L;
LinkList HEAD_INSERT()//头插法
{
LNode *s;
int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;//建立头指针
scanf("%d",&x);
while(x != 999)
{
s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域;
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
void print_list()
{
LinkList p;
p=L->next;//p指向单链表第一个节点
while( p )
{
printf("%5d",p->data);
p=p->next;
}
}
LNode * get_pre(int i)//获得前驱节点
{
int j=1;
LNode *p;
p=L->next;
if( i == 0 )
return L;
if( i < 0 )
return NULL;//参数不合法
while ( p && j < i )
{
p=p->next;
++j;
}
return p;//返回查找到的前驱节点;
}
void list_insert()//插入链表
{
int x;
int i;
LNode *p,*s;
s = (LinkList) malloc(sizeof(LNode ));
printf("请输入要插入的数据: \n");
scanf("%d",&x);
printf("请输入要插入的位置: \n");
scanf("%d",&i);
s->data=x;
p=get_pre(i-1);//记录要插位置 的前驱节点;
s->next=p->next;//改变链表指针的指向,实现插入操作;
p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链;
}
void delete_list()
{
int i;
LNode *p;
LNode *q,*s;
printf("输入要删除的节点的序号: \n");
scanf("%d",&i);
p=get_pre(i-1);//寻找被删除的节点的前驱;
s=p->next;//s即为被删除的节点;
q=p->next->next;//记录被删除节点的后继;
p->next=q;//改变链指针的指向,删除s
free(s);//释放被删除节点的空间;
}
int main()
{
printf("Hello world!\n");
HEAD_INSERT();
printf("初始链表为: \n");
print_list();
printf("\n");
list_insert();
printf("插入之后的链表: \n");
print_list();
printf("\n");
delete_list();
printf("删除之后的链表: \n");
print_list();
printf("\n");
return 0;
}
上一篇: C语言单链表的创建、插入、查找、删除、求长、排序、遍历
下一篇: web中的事件委托