鱼C论坛

 找回密码
 立即注册
查看: 2446|回复: 2

[已解决]大家看一下,我的单链表是头插法插的

[复制链接]
发表于 2017-8-8 02:13:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家看一下,我的单链表是头插法插的,所以存储顺序和逻辑顺序是反的,现在我想用ListInsert插入一个元素然后用GetElem函数和for()语句输出单链表中的元素,老是插不到位置上,求大神解答。



#include<stdio.h>
#include<stdlib.h>
#define  ERROR  0
typedef struct LNode
{
int data;
struct LNode;
LNode *next;
}
node,*LinkList;//线性表单链表的存储结构


void CreateList_L(LinkList &L,int n)
{       
        int i;
        LinkList p;
        L=(LinkList)malloc(sizeof(node));//假设p是LinkList型的变量,这行语句的意思是由系统生成一个L弄node型结点,同时将该节点的起始位置赋给指针p
        for(i=n;i>0;--i)
        {
        p=(LinkList)malloc(sizeof(node));//生成新节结点
        scanf("%d",&p->data);
        p->next=L->next;
        L->next=p;
}
}//CreateList_l

int GetElem_L(LinkList L,int i,int e)
{
LinkList p;
p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
{return ERROR;}

e=p->data;
return e;
}//GetElem_L


int ListInsert_L(LinkList L,int i, int e)
{
//在带头结点的单链表L中的第i个位置之前插入元素e
LinkList p;
LinkList s;
int j=0;
p=L;
if(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1)
{return ERROR;}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return e;
}








void main()
{
LinkList L;
int n;
int m;
int i;
int e;
printf("请输入结点的个数?");
scanf("%d",&n);

        CreateList_L(L,n);
        printf("你要读取第几个结点?");
        scanf("%d",&m);
        e=GetElem_L(L,n-m+1,e);
        printf("%d\n",e);

       
printf("你想在倒数第几个元素之前插入新元素\n");
scanf("%d",&i);
printf("你想插入的元素是");
scanf("%d",&e);
ListInsert_L(L,n-i+1,e);
printf("你确定插入的元素是%d\n",e);


for(i=n+1;i>0;i--)
{
e=GetElem_L(L,i,e);
        printf("%d",e);
}

}


最佳答案
2017-8-8 14:10:14
参考:
  1. #include<stdio.h>
  2. #include<stdlib.h>


  3. #define  ERROR  0

  4. typedef struct LNode
  5. {
  6.         int data;
  7.         struct LNode *next;
  8. }node,*LinkList;//线性表单链表的存储结构


  9. void CreateList_L(LinkList *L,int n)
  10. {        
  11.         int i;
  12.         LinkList p, temp;

  13.         for(i=n;i>0;--i)
  14.         {
  15.                 p=(LinkList)malloc(sizeof(node));//生成新节结点
  16.                 printf("请输入第%d个节点的数据:", i);
  17.                 scanf("%d",&p->data);

  18.                 if(*L == NULL)//这里使用的是头插法
  19.                 {
  20.                         *L = p;
  21.                         p->next = NULL;
  22.                 }
  23.                 else
  24.                 {
  25.                         temp = *L;
  26.                         *L = p;
  27.                         p->next = temp;
  28.                 }

  29.         }
  30. }

  31. void printNode(LinkList L)
  32. {
  33.         LinkList head;

  34.         head = L;
  35.         while(head)
  36.         {
  37.                 printf("%d \n", head->data);
  38.                 head=head->next;
  39.         }
  40. }

  41. int GetElem_L(LinkList L,int i)
  42. {
  43.         LinkList p;
  44.         int j=1;
  45.         int result;

  46.         p=L;
  47.         while(p && j<i)
  48.         {
  49.                 p=p->next;
  50.                 j++;
  51.         }
  52.         if(!p || j>i)
  53.                 {return ERROR;}

  54.         result=p->data;

  55.         return result;
  56. }//GetElem_L


  57. int ListInsert_L(LinkList L,int i, int e)
  58. {
  59. //在带头结点的单链表L中的第i个位置之前插入元素e
  60.         LinkList p;
  61.         LinkList s;
  62.         int j=0;

  63.         p=L;
  64.         if(p && j<i-1)
  65.         {
  66.                 p=p->next;
  67.                 j++;
  68.         }
  69.         if(!p || j>i-1)
  70.                 {return ERROR;}

  71.         s=(LinkList)malloc(sizeof(node));
  72.         s->data=e;
  73.         s->next=p->next;
  74.         p->next=s;
  75.         return e;
  76. }

  77. void main()
  78. {
  79.         LinkList L = NULL;
  80.         int n;
  81.         int m;
  82.         int i;
  83.         int e;

  84.         printf("请输入结点的个数?");
  85.         scanf("%d",&n);

  86.         CreateList_L(&L,n);

  87.         printNode(L);

  88.         printf("你要读取第几个结点?");
  89.         scanf("%d",&m);

  90.         e=GetElem_L(L,n-m+1);
  91.         printf("%d\n",e);

  92.         
  93.         printf("你想在倒数第几个元素之前插入新元素\n");
  94.         scanf("%d",&i);
  95.         printf("你想插入的元素是");
  96.         scanf("%d",&e);
  97.         ListInsert_L(L,n-i+1,e);
  98.         printf("你确定插入的元素是%d\n",e);


  99.         for(i=n+1;i>0;i--)
  100.         {
  101.                 e=GetElem_L(L,i);
  102.                 printf("%d",e);
  103.         }
  104. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-8 12:59:33 | 显示全部楼层
你这代码是神马玩意?你确定你能运行的了???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-8 14:10:14 | 显示全部楼层    本楼为最佳答案   
参考:
  1. #include<stdio.h>
  2. #include<stdlib.h>


  3. #define  ERROR  0

  4. typedef struct LNode
  5. {
  6.         int data;
  7.         struct LNode *next;
  8. }node,*LinkList;//线性表单链表的存储结构


  9. void CreateList_L(LinkList *L,int n)
  10. {        
  11.         int i;
  12.         LinkList p, temp;

  13.         for(i=n;i>0;--i)
  14.         {
  15.                 p=(LinkList)malloc(sizeof(node));//生成新节结点
  16.                 printf("请输入第%d个节点的数据:", i);
  17.                 scanf("%d",&p->data);

  18.                 if(*L == NULL)//这里使用的是头插法
  19.                 {
  20.                         *L = p;
  21.                         p->next = NULL;
  22.                 }
  23.                 else
  24.                 {
  25.                         temp = *L;
  26.                         *L = p;
  27.                         p->next = temp;
  28.                 }

  29.         }
  30. }

  31. void printNode(LinkList L)
  32. {
  33.         LinkList head;

  34.         head = L;
  35.         while(head)
  36.         {
  37.                 printf("%d \n", head->data);
  38.                 head=head->next;
  39.         }
  40. }

  41. int GetElem_L(LinkList L,int i)
  42. {
  43.         LinkList p;
  44.         int j=1;
  45.         int result;

  46.         p=L;
  47.         while(p && j<i)
  48.         {
  49.                 p=p->next;
  50.                 j++;
  51.         }
  52.         if(!p || j>i)
  53.                 {return ERROR;}

  54.         result=p->data;

  55.         return result;
  56. }//GetElem_L


  57. int ListInsert_L(LinkList L,int i, int e)
  58. {
  59. //在带头结点的单链表L中的第i个位置之前插入元素e
  60.         LinkList p;
  61.         LinkList s;
  62.         int j=0;

  63.         p=L;
  64.         if(p && j<i-1)
  65.         {
  66.                 p=p->next;
  67.                 j++;
  68.         }
  69.         if(!p || j>i-1)
  70.                 {return ERROR;}

  71.         s=(LinkList)malloc(sizeof(node));
  72.         s->data=e;
  73.         s->next=p->next;
  74.         p->next=s;
  75.         return e;
  76. }

  77. void main()
  78. {
  79.         LinkList L = NULL;
  80.         int n;
  81.         int m;
  82.         int i;
  83.         int e;

  84.         printf("请输入结点的个数?");
  85.         scanf("%d",&n);

  86.         CreateList_L(&L,n);

  87.         printNode(L);

  88.         printf("你要读取第几个结点?");
  89.         scanf("%d",&m);

  90.         e=GetElem_L(L,n-m+1);
  91.         printf("%d\n",e);

  92.         
  93.         printf("你想在倒数第几个元素之前插入新元素\n");
  94.         scanf("%d",&i);
  95.         printf("你想插入的元素是");
  96.         scanf("%d",&e);
  97.         ListInsert_L(L,n-i+1,e);
  98.         printf("你确定插入的元素是%d\n",e);


  99.         for(i=n+1;i>0;i--)
  100.         {
  101.                 e=GetElem_L(L,i);
  102.                 printf("%d",e);
  103.         }
  104. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 08:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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