代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
char date;
struct Node *next;
}Node , *LinkList;
//创建链表
LinkList creat_linklist(int n)
{
LinkList New_node,Tail_node;
LinkList Head_node = NULL;
char c;
for (size_t i = 0; i < n; i++)
{
printf("请输入在第%d个结点存入的数据:",i+1);
scanf("%c",&c);
fflush(stdin);
New_node = (LinkList)malloc( sizeof(Node) );
New_node->date = c;
New_node->next = NULL;
if (Head_node == NULL)
{
Head_node = New_node;
}else
{
Tail_node->next = New_node;
}
Tail_node = New_node;
}
return Head_node;
}
//从链表中删除结点
void delelink(LinkList *List , int m)
{
LinkList dele_node = *List;//复制一条链表用于找到要删除的结点
for (size_t i = 1; i <m ; i++)//找到要删除的结点
{
dele_node = dele_node->next;
}
if (m==1)
{//如果要删除的是第一个结点,就直接把头指针连接到第二个结点上
*List = dele_node->next;
free(dele_node);//注意释放删除的结点
}else
{//如果删除的不是第一个节点,找出要删除结点的前一个和后一个结点并连接起来
LinkList befor_node = *List;//复制一条链表用于找到删除结点的前一个结点
for (size_t i = 1; i<m-1; i++,befor_node = befor_node->next)
{
}
befor_node->next = dele_node->next;//连接前后两个结点
free(dele_node);//注意释放删除的结点
}
}
int main()
{
int n;
char c;
LinkList List , List2;
//List用于第一次打印单链表,List2用于第二次打印单链表
printf("请输入结点个数:");
scanf("%d",&n);
fflush(stdin);
List = creat_linklist(n);
List2 = List;//复制一遍链表,第一次打印链表后链表后头指针会直接指向NULL,导致第二次打印失败
printf("打印单链表:");
while ( List != NULL )
{
printf("%c" , List->date);
List = List->next;
}
putchar('
');
printf("请输入要删除的结点:");
scanf("%d",&n);
fflush(stdin);
delelink(&List2 , n);
printf("打印单链表:");
while ( List2 != NULL )
{
printf("%c" , List2->date);
List2 = List2->next;
}
return 0;
}
运行结果:
