小白教程

 找回密码
 立即注册
查看: 7718|回复: 3

[已解决]求大佬帮我看下这个c语言链表哪出问题了

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2021-5-15 09:31:01 | 显示全部楼层 |阅读模式
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef int Elemtype;
  4. typedef struct LNode                                //定义一个结构体
  5. {
  6.     Elemtype data;                                   //结点的数据域
  7.     struct LNode *next;                              //节点的指针域
  8. }LNode , *LinkList;                                  //指针类型

  9. int InitList(LinkList L)                            //带有头节点的单链表的初始化
  10. {
  11.     L= (LinkList)malloc(sizeof(LNode));            
  12.     if (!L)                                          //储存分配失败退出
  13.     {
  14.         printf("分配内存失败!\n");
  15.         exit(0);
  16.     }
  17.     L->next = NULL;                                 //空表长度为null                  
  18.     return 0;
  19. }

  20. int LengthList(LinkList L)                    //计算链表长度
  21. {
  22.     int length = 0;
  23.     LinkList p;
  24.     p = L->next;
  25.     while (p)
  26.     {
  27.         length++;
  28.         p = p->next;
  29.     }
  30.     return length;
  31. }

  32. int GetElem(LinkList L, int i, Elemtype e)            //用e返回L中第i个元素值
  33. {
  34.     LinkList p;                                     //初始化,p指向首元结点,计数器j=1
  35.     int j = 1;
  36.     p = L->next;                                    //顺序链表向后扫描,直到p为空或者p指向第i个元素
  37.     while (p && j < i)
  38.     {
  39.         p = p->next;                                //p指向下一个元素
  40.         ++j;
  41.     }
  42.     if (!p || j > i)                              //i不合法
  43.     {
  44.         printf("查询不到该元素!\n");
  45.         return 0;
  46.     }
  47.     e = p->data;                                   
  48.     return 0;
  49. }


  50. void CreateList_F(LinkList L,int n)            //头插法创建一个单链表,n为要插入的元素个数
  51. {
  52.     int i;
  53.     LinkList p;
  54.     L = (LinkList)malloc(sizeof(LNode));
  55.     L->next = NULL;
  56.     printf("请输入您要插入元素的个数:");
  57.     scanf("%d", &n);
  58.     printf("请输入你要插入的元素值(用空格隔开):");
  59.     for (i = n; i >0;--i)
  60.     {
  61.         p = (LNode*)malloc(sizeof(LNode));
  62.         scanf_s("%d", &p->data);
  63.         p->next = L->next;
  64.         L->next = p;
  65.     }
  66.      
  67. }

  68. int InsertList_L(LinkList L, int i, Elemtype e)            //在L中第i个位置插入元素e
  69. {
  70.     LinkList p, s;
  71.     int j = 0;
  72.     p = L;
  73.     while (p && j < i)                                  //寻找第i-1结点
  74.     {                                                      
  75.         p = p->next;
  76.         ++j;
  77.     }
  78.     if (!p || j > i) exit(1);                         //i大于表长+1或者小于1
  79.     s = (LinkList)malloc(sizeof(LNode));               //生成新结点s
  80.     s->data = e;                                      //将结点的数据域置为e
  81.     s->next = p->next;                                 //将结点s插入L中
  82.     p->next = s;
  83.     return 0;
  84. }

  85. int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
  86. {
  87.     LinkList p, q;
  88.     int j = 0;
  89.     p = L;
  90.     printf("请输入要删除的结点位置:");
  91.      
  92.     while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
  93.     {
  94.         p = p->next;
  95.         ++j;
  96.     }
  97.     if (!(p->next) || j > i) exit(1);            //删除位置不合理
  98.     q = p->next;                                 //临时保存被删除结点的地址以备释放
  99.     p->next = q->next;                           //改变删除结点的前驱结点指针域
  100.     free(q); //释放
  101.    return 0;
  102. }

  103. void ShowList(LinkList L)                    //打印整个链表
  104. {
  105.     LinkList p;
  106.     p = L->next;
  107.     if (p == NULL)
  108.     {
  109.         printf("这是一个空链表!\n");
  110.     }
  111.     printf("单链表");
  112.     while (p)
  113.     {
  114.         printf(" -> %d", p->data);
  115.         p = p->next;
  116.     }
  117.     printf("\n");
  118. }

  119. main()
  120. {
  121.   LinkList L;
  122.   int n;
  123.   int i,k;
  124.   printf("单链表的操作:\n");
  125.   printf("\t1.头插法建立单链表\n");
  126.   printf("\t2.输出单链表\n");   
  127.   printf("\t3.删除结点\n");
  128.   printf("\t4.退出\n");
  129.   do
  130.   {

  131.       printf("选择所需功能: ");
  132.       scanf("%d",&k);
  133.       switch(k)
  134.       {
  135.           case 1:CreateList_F( L, n);
  136.                   break;
  137.          case 2:printf("单链表为:\n");
  138.                  ShowList(L);
  139.                   break;
  140.    
  141.           case 3:
  142.                   DeleteList_L( L, i);
  143.                   break;
  144.          
  145.           case 4:printf("退出");
  146.               exit(0);
  147.             default:printf("输入错误\n");
  148.               exit(0);
  149.         }
  150.     }while(1);
  151. }
复制代码


最佳答案
2021-5-30 20:02:06
删除和显示输出链表函数,增加对空链表的判断及反馈,供参考:
  1. int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
  2. {
  3.     LinkList p, q;
  4.     int j = 0;
  5.     p = L;
  6.     if(L == NULL){
  7.        printf("这是一个空链表!\n");
  8.        return -1;
  9.     }
  10.     //printf("请输入要删除的结点位置:");

  11.     while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
  12.     {
  13.         p = p->next;
  14.         ++j;
  15.     }
  16.     if (!(p->next) || j > i) exit(1);            //删除位置不合理
  17.     q = p->next;                                 //临时保存被删除结点的地址以备释放
  18.     p->next = q->next;                           //改变删除结点的前驱结点指针域
  19.     free(q); //释放
  20.     return 0;
  21. }

  22. void ShowList(LinkList L)                    //打印整个链表
  23. {
  24.     LinkList p;
  25.     if (L == NULL)
  26.     {
  27.         printf("这是一个空链表!\n");
  28.         return;
  29.     }
  30.     printf("单链表");
  31.     p = L->next;
  32.     while (p)
  33.     {
  34.         printf(" -> %d", p->data);
  35.         p = p->next;
  36.     }
  37.     printf("\n");
  38. }
复制代码
回复

使用道具 举报

1

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2021-5-18 16:18:28 | 显示全部楼层
  1. int InitList(LinkList L)                           
  2. {
  3.     L= (LinkList)malloc(sizeof(LNode));             //修改形参没有用处,离开这个函数形参就结束存在了
  4.     if (!L)                                         
  5.     {
  6.         printf("分配内存失败!\n");
  7.         exit(0);
  8.     }
  9.     L->next = NULL;                                 
  10.     return 0;
  11. }
复制代码
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-5-24 10:19:08 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef int Elemtype;
  4. typedef struct LNode                                //定义一个结构体
  5. {
  6.     Elemtype data;                                   //结点的数据域
  7.     struct LNode *next;                              //节点的指针域
  8. }LNode , *LinkList;                                  //指针类型

  9. int InitList(LinkList L)                            //带有头节点的单链表的初始化
  10. {
  11.     L= (LinkList)malloc(sizeof(LNode));
  12.     if (!L)                                          //储存分配失败退出
  13.     {
  14.         printf("分配内存失败!\n");
  15.         exit(0);
  16.     }
  17.     L->next = NULL;                                 //空表长度为null
  18.     return 0;
  19. }

  20. int LengthList(LinkList L)                    //计算链表长度
  21. {
  22.     int length = 0;
  23.     LinkList p;
  24.     p = L->next;
  25.     while (p)
  26.     {
  27.         length++;
  28.         p = p->next;
  29.     }
  30.     return length;
  31. }

  32. int GetElem(LinkList L, int i, Elemtype e)            //用e返回L中第i个元素值
  33. {
  34.     LinkList p;                                     //初始化,p指向首元结点,计数器j=1
  35.     int j = 1;
  36.     p = L->next;                                    //顺序链表向后扫描,直到p为空或者p指向第i个元素
  37.     while (p && j < i)
  38.     {
  39.         p = p->next;                                //p指向下一个元素
  40.         ++j;
  41.     }
  42.     if (!p || j > i)                              //i不合法
  43.     {
  44.         printf("查询不到该元素!\n");
  45.         return 0;
  46.     }
  47.     e = p->data;
  48.     return 0;
  49. }


  50. void CreateList_F(LinkList *L,int n)            //头插法创建一个单链表,n为要插入的元素个数
  51. {
  52.     int i;
  53.     LinkList p;
  54.     (*L) = (LinkList)malloc(sizeof(LNode));
  55.     (*L)->next = NULL;
  56.     printf("请输入您要插入元素的个数:");
  57.     scanf("%d", &n);
  58.     printf("请输入你要插入的元素值(用空格隔开):");
  59.     for (i = n; i >0;--i)
  60.     {
  61.         p = (LNode*)malloc(sizeof(LNode));
  62.         //scanf_s("%d", &p->data);
  63.         scanf("%d", &p->data);
  64.         p->next = (*L)->next;
  65.         (*L)->next = p;
  66.     }

  67. }

  68. int InsertList_L(LinkList L, int i, Elemtype e)            //在L中第i个位置插入元素e
  69. {
  70.     LinkList p, s;
  71.     int j = 0;
  72.     p = L;
  73.     while (p && j < i)                                  //寻找第i-1结点
  74.     {
  75.         p = p->next;
  76.         ++j;
  77.     }
  78.     if (!p || j > i) exit(1);                         //i大于表长+1或者小于1
  79.     s = (LinkList)malloc(sizeof(LNode));               //生成新结点s
  80.     s->data = e;                                      //将结点的数据域置为e
  81.     s->next = p->next;                                 //将结点s插入L中
  82.     p->next = s;
  83.     return 0;
  84. }

  85. int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
  86. {
  87.     LinkList p, q;
  88.     int j = 0;
  89.     p = L;
  90.     //printf("请输入要删除的结点位置:");

  91.     while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
  92.     {
  93.         p = p->next;
  94.         ++j;
  95.     }
  96.     if (!(p->next) || j > i) exit(1);            //删除位置不合理
  97.     q = p->next;                                 //临时保存被删除结点的地址以备释放
  98.     p->next = q->next;                           //改变删除结点的前驱结点指针域
  99.     free(q); //释放
  100.     return 0;
  101. }

  102. void ShowList(LinkList L)                    //打印整个链表
  103. {
  104.     LinkList p;
  105.     p = L->next;
  106.     if (p == NULL)
  107.     {
  108.         printf("这是一个空链表!\n");
  109.     }
  110.     printf("单链表");
  111.     while (p)
  112.     {
  113.         printf(" -> %d", p->data);
  114.         p = p->next;
  115.     }
  116.     printf("\n");
  117. }

  118. //main()
  119. int main()
  120. {
  121.     LinkList L;
  122.     int n;
  123.     int i,k;
  124.     printf("单链表的操作:\n");
  125.     printf("\t1.头插法建立单链表\n");
  126.     printf("\t2.输出单链表\n");
  127.     printf("\t3.删除结点\n");
  128.     printf("\t4.退出\n");
  129.     do
  130.     {

  131.         printf("选择所需功能: ");
  132.         scanf("%d",&k);
  133.         switch(k)
  134.         {
  135.             case 1:CreateList_F(&L, n);
  136.                    break;
  137.             case 2:printf("单链表为:\n");
  138.                    ShowList(L);
  139.                    break;

  140.             case 3:
  141.                    printf("请输入要删除的结点位置: ");
  142.                    scanf("%d", &i);
  143.                    DeleteList_L( L, i);
  144.                    break;

  145.             case 4:printf("退出");
  146.                    exit(0);
  147.             default:printf("输入错误\n");
  148.                     exit(0);
  149.         }
  150.     }while(1);
  151. }
复制代码

供参考~
回复

使用道具 举报

0

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2021-5-30 20:02:06 | 显示全部楼层 &
删除和显示输出链表函数,增加对空链表的判断及反馈,供参考:
  1. int DeleteList_L(LinkList L, int i)                //删除L中第i个元素,并用e返回其值
  2. {
  3.     LinkList p, q;
  4.     int j = 0;
  5.     p = L;
  6.     if(L == NULL){
  7.        printf("这是一个空链表!\n");
  8.        return -1;
  9.     }
  10.     //printf("请输入要删除的结点位置:");

  11.     while (p->next && j < i-1)                  //寻找第i个结点,并令p指向其前驱
  12.     {
  13.         p = p->next;
  14.         ++j;
  15.     }
  16.     if (!(p->next) || j > i) exit(1);            //删除位置不合理
  17.     q = p->next;                                 //临时保存被删除结点的地址以备释放
  18.     p->next = q->next;                           //改变删除结点的前驱结点指针域
  19.     free(q); //释放
  20.     return 0;
  21. }

  22. void ShowList(LinkList L)                    //打印整个链表
  23. {
  24.     LinkList p;
  25.     if (L == NULL)
  26.     {
  27.         printf("这是一个空链表!\n");
  28.         return;
  29.     }
  30.     printf("单链表");
  31.     p = L->next;
  32.     while (p)
  33.     {
  34.         printf(" -> %d", p->data);
  35.         p = p->next;
  36.     }
  37.     printf("\n");
  38. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-9-20 12:31 , Processed in 0.035833 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表