单链表的插入和删除

这篇博客介绍了如何使用C语言创建一个链表,并实现了链表中节点的插入和删除操作。首先定义了一个结构体`ListNode`表示链表节点,然后通过`CreatList`函数创建链表,`DisPlay`函数显示链表,`Insert`函数在指定位置插入节点,`Dele`函数删除指定位置的节点。在主函数中,展示了这些操作的使用流程。
摘要由CSDN通过智能技术生成

#include<stdio.h>
#include<malloc.h>
typedef int DateType;
typedef struct node {
 DateType date;
 struct node *next;
}ListNode;


int CreatList(ListNode *head) {
 ListNode *p;
 p = head;
 DateType x;
 int n,i;
 printf("请输入创建节点个数\n");
 scanf("%d",&n);
 printf("请输入值: ");
 for(i=0; i<n; i++) {
  scanf("%d",&x);
  ListNode *s = (ListNode*)malloc(sizeof(ListNode));
  if(!s) {
   printf("空间申请失败!\n");
   return 0;
  }
  s->date = x;
  p->next = s;
  p = s;
 }
 p->next = NULL;
 return 1;
}

void DisPlay(ListNode *head) {
 ListNode *p;
 p = head->next;
 if(p == NULL) {
  printf("空链表!\n");
  return;
 }
 printf("打印链表喽!\n");
 while(p != NULL) {
  printf("%d ",p->date);
  p = p->next;
 }
 printf("\n");
 return;
}

int Insert(ListNode *head,int k,DateType x) {
 ListNode *p  = head;
 if(p->next == NULL) {
  printf("空链表!\n");
  return 0;
 }
 int i=0;
 while(p != NULL && i<k) {
  p = p->next;
  i++;
 }
 if(i == k) {
  ListNode *s = (ListNode*)malloc(sizeof(ListNode));
  if(!s) {
   return 0;
  }
  s->date = x;
  s->next = p->next;
  p->next = s;
  return 1;
 }
 else {
  printf("插入位置错误!\n");
  return 0; 
 }
}

int Dele(ListNode *head,int k) {
 ListNode *p = head;
 if(p->next == NULL) {
  printf("空链表!\n");
  return 0; 
 }
 int i=0;
 while(p != NULL && i<k) {
  p = p->next;
  i++;
 }
 if(!p || !p->next) {
  printf("删除位置错误!\n");
  return 0;
 }
 ListNode *s = p->next;
 p->next = s->next;
 free(s);
 return 1;
}

int main() {
 ListNode *head = (ListNode*)malloc(sizeof(ListNode));
 if(head == NULL) {
  printf("申请空间失败!");
 }
 if(CreatList(head)) {
  printf("创建成功啦!\n");
  DisPlay(head);
 }
 
 int k; DateType x;
 printf("输入将插入位置和值:\n");
 scanf("%d %d",&k,&x);
 if(Insert(head,k-1,x)) {
  printf("插入成功!\n");
  DisPlay(head);
 }
 
 printf("输入将删除位置:\n");
 scanf("%d",&k);
 if(Dele(head,k-1)) {
  printf("删除成功!\n");
  DisPlay(head);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值