鱼C论坛

 找回密码
 立即注册
查看: 2683|回复: 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
参考:
#include<stdio.h>
#include<stdlib.h>


#define  ERROR  0

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);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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


#define  ERROR  0

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);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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