数据结构C语言实现----从链表中删除结点
代码如下:
#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; }
运行结果: