单链表,随机数(完整版)

这篇博客详细介绍了如何使用C语言实现一个带头结点的单链表,包括初始化链表、插入随机数、按序号查找元素、删除指定序号的元素等功能。代码中包含了生成10个1-100随机整数并插入链表,以及用户交互式的查找和删除操作。
摘要由CSDN通过智能技术生成

(1)定义单链表link2,产生10个1-100的随机整数,通过插入函数依次保存到带头结点的Link2中,并输出插入后的 link2元素序列。

(2)查找link2中第i个元素〈i由用户输入),输出第i个元素的值。

(3)调用删除函数删除 link2中第i个元素(i由用户输入),删除成功后输出删除后的link2的元素序列,删除失败则显示不存在这个数。

备注:产生随机数的方法srand((int)time(0)),rand();(随机函数所在头文件<stdlib.h>,时间函数所在头文件<time.h>)
 

#include <stdio.h>
#include <stdlib.h>
int ch,c;//ch选择变量,c是否继续的变量
typedef int elemtype;
typedef struct node
{
    int date;
    struct node *next;
}Linklist;
//初始化带头结点的单链表
Linklist *initlist()//初始化带头结点的单链表
{
    Linklist *h;
     h=(Linklist *)malloc(sizeof(Linklist));
     h->next=NULL;
     return h;
}
Linklist *getnum(Linklist *h,int c)//查找第i个结点
{
    Linklist *p=h;
    int j=0;
    while(p->next&&j<c)
    {
        p=p->next;
        j++;
    }
    if(c==j)return p;
    else return NULL;
}
void  intput(Linklist *h,int i,int x)
{
    Linklist *p,*s;
    p=getnum(h,i-1);//找到插入位置的前驱结点指针
    s=(Linklist *)malloc(sizeof(Linklist));//给新节点分配空间
    s->date=x;//x存入新结点的数据域
    s->next=p->next;
    p->next=s;
}
void printlinklist(Linklist *h)//输出链表
{
    Linklist *p=h->next;
    while(p!=NULL)//当前结点不为空
    {
         printf("%-4d",p->date);//输出当前结点的数据
         p=p->next;//移动指针指向下一个结点
    }
}
void find(Linklist *h)
{
    printf("\n\n\t\t\t\t\t +---------------查找信息选择--------------+\n");
    printf("\t\t\t\t\t |                                         |\n");
    printf("\t\t\t\t\t |        1--按序号查找   2--按值查找      |\n");
    printf("\t\t\t\t\t +-----------------------------------------+\n");
    while(1)
      {
        printf("\t\t\t\t\t请输入你查找的选择:(1-2)");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1:find1(h);break;

            case 2:find2(h);break;

            default:printf("\t\t\t\t\t请输入有效数字!");
        }getchar();
       printf("\n\t\t\t\t\t是否继续:是请输入'Y'或'y',否请输入'N'或'n':");
       c=getchar();
       printf("\t\t\t\t\t--------------------------------------------\n");
       if(c=='Y'||c=='y')continue;
       else if(c=='N'||c=='n')break;
     }
}
int find1(Linklist *h)
{
    Linklist *p;
    int j=0,x;
    p=h->next;
    printf("\t\t\t\t\t请输入要查找元素的序号:");
    scanf("%d",&x);
    if(x<=0)return NULL;//指定的位置非法时返回NULL
    p=h;
    while(p->next!=NULL&&j<x)
     {
       p=p->next;//不是目标结点且有后继结点时继续查找
       j++;
     }
   if(x==j)//找到目标结点,进行输出
    printf("\t\t\t\t\t找到第%d个元素为: %d\n",x, p->date);
   else printf("\t\t\t\t\t没有找到第%d个元素! \n",x);
   return 0;
}
void find2(Linklist *h)
 {
    int i=1,f;
    Linklist *p;
    p=h->next;//指针指向首结点
    printf("\t\t\t\t\t请输入要查找的数:");
    scanf("%d",&f);
    while(p!=NULL)
    if(p->date!=f)
     {
        p=p->next;//取下一个结点,继续查找
        i++;
     }
    else break;//找到,结束循环,进行输出
    if(p!=NULL)
    printf("\t\t\t\t\t已找到,位置是%d\n",i);
    else printf("\t\t\t\t\t未找到\n");
 }
void del(Linklist *h)
{
    printf("\n\n\t\t\t\t\t +---------------删除信息选择--------------+\n");
    printf("\t\t\t\t\t |                                         |\n");
    printf("\t\t\t\t\t |        3--按序号删除   4--按值删除      |\n");
    printf("\t\t\t\t\t +-----------------------------------------+\n");
    while(1)
      {

        printf("\n\t\t\t\t\t请输入你删除的选择:(3-4)");
        scanf("%d",&ch);
        switch(ch)
        {
            case 3:del3(h);break;

            case 4:del4(h);break;

            default:printf("\t\t\t\t\t请输入有效数字!");
        }getchar();
       printf("\n\t\t\t\t\t是否继续:是请输入'Y'或'y',否请输入'N'或'n':");
       c=getchar();
       printf("\t\t\t\t\t--------------------------------------------\n");
       if(c=='Y'||c=='y')continue;
       else if(c=='N'||c=='n')break;
     }
}
 int del3(Linklist *h)
 {
    Linklist *q,*p=h;
    int d,j=1;
    printf("\n\t\t\t\t\t请输入要删除的元素的位置:");
    scanf("%d",&d);
    if(d<=0)
      {
        printf("\t\t\t\t\t删除结点位置不合理!");
        return NULL;
      }
    while(p->next!=NULL&&j<d)
      {
        p=p->next;
        j++;
      }
    q=p->next;
    p->next=q->next;
    free(q);//清空该结点
    printf("\t\t\t\t\t删除成功!\n");
    printf("\t\t\t\t\t删除结点后单链表:\n");
    printf("\t\t\t\t\t");
    printlinklist(h);
    if(p=p->next==NULL)
      {
        printf("\t\t\t\t\t删除结点位置不合理!");
        return NULL;
       }
 }
 int del4(Linklist *h)
 {
    Linklist *q,*p=h;
    int d;
    printf("\n\t\t\t\t\t请输入要删除的元素:");
    scanf("%d",&d);
    while(p->next!=NULL)//若p有后继结点
     {
      if(p->next->date==d)
       {
         q=p->next;//q标记被删除的节点
         p->next=q->next;
         free(q);
         h->date--;
         break;
       }
     p=p->next ;//不满足if继续指针后移
    }
    printf("\t\t\t\t\t删除成功!\n");
    printf("\t\t\t\t\t删除结点后单链表:\n");
    printf("\t\t\t\t\t");
    printlinklist(h);
    if(p->next==NULL)
     {
       printf("Not Find! \n");
       return 0;
     }
 }
int main()
{
    int e,i;
    Linklist *head;
    head=initlist();//初始化单链表
    srand((int)time(NULL));
    for(i=1;i<=10;i++)
      {
        e=rand()%100;
        intput(head,i,e);//生成随机数插入单链表
      }
     while(1)
        {
           system("cls");
           printf("\n\t\t\t\t\t生成的随机数单链表\n");//每次清屏都对链表进行输出
           printf("\t\t\t\t\t");
           printlinklist(head);
           printf("\n\n\n");
           printf("\t\t\t\t\t                信息功能选择              \n");
           printf("\t\t\t\t\t++++++++++++++++++++++++++++++++++++++++++\n");
           printf("\t\t\t\t\t+                1--查找                 +\n");
           printf("\t\t\t\t\t+                2--删除                 +\n");
           printf("\t\t\t\t\t+                3--退出系统             +\n");
           printf("\t\t\t\t\t++++++++++++++++++++++++++++++++++++++++++\n");

           printf("\n\t\t\t\t\t请输入你要进行的操作:(1-3)");
           scanf("%d",&ch);
           switch(ch)
            {
              case 1:find(head);printf("\t\t\t\t\t");system("pause");break;

              case 2:del(head);printf("\t\t\t\t\t");system("pause");break;

              case 3:printf("\t\t\t\t\t");system("cls");
              centre();
               {
                 printf("\t  感谢你的使用!");
                 Sleep(2000);
                }
              system("cls");
              exit(1);
              default:printf("请输入有效数字!");
           }
        }
   return 0;
}
void centre()
{
    int t;
    for(t=0;t<12;t++)
    printf("\n");
    printf("\t\t\t\t\t");
}

头插法(也称为前驱插入)是一种链表操作技巧,用于在链表的头部插入新元素。首先,我们需要创建一个单链表结构和相关的节点类型。然后,我们可以使用rand()函生成随机数,结合while循环确保生成的字都在指定范围内。 以下是如何用C语言实现这个功能的步骤: 1. 定义链表结构: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct Node { int data; struct Node* next; } Node; Node* createEmptyList() { return NULL; } ``` 2. 随机数生成和链表头部插入: ```c void insertRandom(Node** head, int min, int max) { srand(time(0)); // 初始化随机数种子 while (true) { int random_num = rand() % (max - min + 1) + min; // 生成1到(max+1-min)之间的随机数 if (random_num >= 1 && random_num <= 200) { // 检查是否在范围1到200内 Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = random_num; newNode->next = *head; // 将新节点链接到当前头节点之后 *head = newNode; // 更新头节点 break; } } } // 另外,可能还需要一个打印链表的方法 void printList(Node* head) { Node* current = head; while (current != NULL) { printf("%d -> ", current->data); current = current->next; } printf("NULL\n"); } ``` 3. 使用这些函创建并显示链表: ```c int main() { Node* head = createEmptyList(); for (int i = 0; i < 20; i++) { insertRandom(&head, 1, 200); } printList(head); return 0; } ``` 运行这段代码后,你会得到一个包含20个1到200之间随机链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值