自己用C写的单链表

用C语言写的,C只是我的入门语言,没怎么深学。写的这个我感觉烦琐的要命,不要笑我啊:(

#include<malloc.h>
#include<stdio.h>
int N=0;
typedef struct node{
 int x;
 struct node *next;
}member;

struct node *Creat() //创建单链表
{
 struct node *h,*s,*p;
 int i;
 if((h=(member *)malloc(sizeof(member)))==NULL)
 {
  printf("不能分配内存空间");
  exit(0);
 }
 h->x=0;
 h->next=NULL;
 p=h;
 for(i=1;i<10;i++)
 {
  N++;
  if((s=(member *)malloc(sizeof(member)))==NULL)
  {
   printf("不能分配内存空间");
   exit(0);
  }
  p->next=s;
  s->x=i;
  s->next=NULL;
  p=s;
 }
 return(h);
}
view(struct node *head) //读取链表的内容
{
 struct node *p;
 p=head;
 while(p->next!=NULL)
 {
  printf("%d/t",p->x);
  p=p->next;
 }
 printf("%d/n",p->x);
}
insert(struct node *head,int num) //插入节点
{
 int t=1;
 struct node *p1,*p2;
 p1=head;
 
 while(t<num-1)
 {
  p1=p1->next;
  t++;
 }
 p2=(member *)malloc(sizeof(struct node));
 printf("请输入插入节点的数域(int型)");
 scanf("%d",&p2->x);
 p2->next=p1->next;
 p1->next=p2;
 N++;
}
del(struct node *head,int num) //删除所选节点
{
 int t=1;
 struct node *p1,*p2;
 p1=head;
 while(t<num-1)
 {
  p1=p1->next;
  t++;
 }
 p2=p1->next->next;
 free(p1->next);
 p1->next=p2;
 N--;
}
int select(struct node *head,int b) //查找元素数据域

 int y;
 struct node *p1;
 
 for(p1=head;p1->next!=NULL;p1=p1->next)
 {
  if((p1->x)==b)
  {
   return(0);
  }
 }
 if((p1->x)==b)
 {
  return(0);
 }
}


void main()
{
 int a,num;
 member *head;
 head=Creat();
go:
 printf("含有%d个元素的单链表已经创建完毕./n请选择:1.查看链表各数据域  2.插入节点  3.删除指定节点  4.查询数据域  5.退出/t",N+1);
 scanf("%d",&a);
 switch(a)
 {
  case 1:
   view(head);
   goto go;
   break;
  case 2:
   printf("要再第几个节点出插入新节点?");
   scanf("%d",&num);
   if(num>N+1||num<1)
   {
    printf("请在1到%d中选择/n",N+1);
    goto go;
   }
   insert(head,num);
   goto go;
   break;

  case 3:
   printf("要删除第几个节点?");
   scanf("%d",&num);
   if(num>N+1||num<1)
   {
    printf("请在1到%d中选择/n",N+1);
    goto go;
   }
   del(head,num);
   goto go;
   break;
  case 4:
   printf("输入查询的关键字(int型)?");
   scanf("%d",&num);
   if(select(head,num)==0)
   {
    printf("OK/n");
   }
   else
   {
    printf("ERROR/n");
   }
   goto go;
  case 5:
   break;
  default:
   printf("请正确选择");
   goto go;
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
单链表的基本操作包括:创建、插入、删除、查找、显示。下面是使用C语言实现单链表基本操作的代码: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表结构体 typedef struct Node { int data; // 数据域 struct Node *next; // 指针域 } Node, *List; // 创建单链表 List createList() { List head = (List)malloc(sizeof(Node)); // 创建头结点 head->next = NULL; // 头结点的指针域置为NULL return head; } // 插入节点 List insertNode(List head, int data, int index) { Node *newNode = (Node *)malloc(sizeof(Node)); // 创建新节点 newNode->data = data; newNode->next = NULL; if (index == 0) { // 插入到头结点后面 newNode->next = head->next; head->next = newNode; } else { // 插入到链表中间或末尾 Node *p = head->next; int i = 1; while (p && i < index) { // 找到待插入位置的前一个节点 p = p->next; i++; } if (!p || i > index) { // 如果index值不合法,则返回原链表 printf("插入位置不合法!\n"); return head; } newNode->next = p->next; p->next = newNode; } return head; } // 删除节点 List deleteNode(List head, int index) { if (index < 0) { // 如果index值不合法,则返回原链表 printf("删除位置不合法!\n"); return head; } Node *p = head->next; Node *q = head; int i = 0; while (p && i < index) { // 找到待删除节点 q = p; p = p->next; i++; } if (!p) { // 如果index超出链表长度,则返回原链表 printf("删除位置不合法!\n"); return head; } q->next = p->next; free(p); // 释放节点空间 return head; } // 查找节点 int findNode(List head, int data) { Node *p = head->next; int index = 0; while (p) { if (p->data == data) { return index; } p = p->next; index++; } return -1; // 如果找不到,则返回-1 } // 显示链表 void displayList(List head) { Node *p = head->next; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { List head = createList(); head = insertNode(head, 1, 0); head = insertNode(head, 2, 0); head = insertNode(head, 3, 1); head = insertNode(head, 4, 2); displayList(head); // 输出:2 1 3 4 head = deleteNode(head, 3); displayList(head); // 输出:2 1 3 int index = findNode(head, 1); printf("1的位置是:%d\n", index); // 输出:1的位置是:1 return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeVitamin

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值