不失微笑 发表于 2017-8-8 02:13:50

大家看一下,我的单链表是头插法插的

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



#include<stdio.h>
#include<stdlib.h>
#defineERROR0
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);
}

}


ba21 发表于 2017-8-8 12:59:33

你这代码是神马玩意?你确定你能运行的了???

ba21 发表于 2017-8-8 14:10:14

参考:
#include<stdio.h>
#include<stdlib.h>


#defineERROR0

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


void CreateList_L(LinkList *L,int n)
{      
        int i;
        LinkList p, temp;

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

                if(*L == NULL)//这里使用的是头插法
                {
                        *L = p;
                        p->next = NULL;
                }
                else
                {
                        temp = *L;
                        *L = p;
                        p->next = temp;
                }

        }
}

void printNode(LinkList L)
{
        LinkList head;

        head = L;
        while(head)
        {
                printf("%d \n", head->data);
                head=head->next;
        }
}

int GetElem_L(LinkList L,int i)
{
        LinkList p;
        int j=1;
        int result;

        p=L;
        while(p && j<i)
        {
                p=p->next;
                j++;
        }
        if(!p || j>i)
                {return ERROR;}

        result=p->data;

        return result;
}//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(node));
        s->data=e;
        s->next=p->next;
        p->next=s;
        return e;
}

void main()
{
        LinkList L = NULL;
        int n;
        int m;
        int i;
        int e;

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

        CreateList_L(&L,n);

        printNode(L);

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

        e=GetElem_L(L,n-m+1);
        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);
                printf("%d",e);
        }
}
页: [1]
查看完整版本: 大家看一下,我的单链表是头插法插的