鱼C论坛

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

[已解决]关于链表的问题

[复制链接]
发表于 2020-11-16 19:53:15 | 显示全部楼层 |阅读模式
10鱼币
好长时间没敲了
都忘的差不多了
不知道为什么会这样 是我写错了吗
能说详细点吗
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
//关于ElemType:它是element type(“元素的类型”)的简化体。
//可以是任何数据类型,这里是int型  

typedef struct Node
{
        int data;
        struct Node * next;
}Node;

typedef struct Node* LinkList;
//link:链接    list:目录

int GetElem (LinkList L,int i,int *e);
//返回链表L第i个数据 

int ListInsert (LinkList L,int i,int e);
//将元素e插入链表L的第i个位置 

int ListDelete (LinkList L,int i,int *e);
//删除链表L的第i个位置的数值,并用e返回其值 

LinkList CreateListHead ();
//创建一个链表——头插法 

int main (void)
{
        LinkList *L;
        LinkList CreateListHead(&L,3);
        
        return 0;
}

int GetElem (LinkList L,int i,int *e)
{
        int j;
        LinkList p = L->next;
        
        for(j = 1  ;  p && j <= i  ;  j++)
        //吧‘p’放在判定结果里,如果‘p’为NULL,那么‘&&’返回为0,程序结束
        //这样的好处就是省去了一次if判定 
        {
                p = p->next;
        }
        
        if( !p || j>i )
        {
                return 0;
        } 
        
        *e = p->data;
        
        return 1;
}

int ListInsert (LinkList L,int i,int e)
{
        int j;
        LinkList _new;
        
        LinkList p = L->next;
        
        while( p && j<i )
        {
                p = p->next;
                j++;
        }
        
        if( !p || j>i )
        {
                return 0;
        }
        
        _new = (LinkList)malloc(sizeof(Node));
        _new->data = e;
        
        _new->next = p->next;
        p->next = _new;
        
        return 1;
} 

int ListDelete (LinkList L,int i,int *e)
{
        int j;
        LinkList p = L;
        
        for(j = 0  ;  j < i && p  ;  j++)
        {
                p = p->next;
        }
        
        if( !(p->next) || j>i )
        {
                return 0;
        }
        
        p = p->next->next;
        
        *e = p->next->data;
        
        free(p->next);
        
        return 1;
} 

LinkList CreateListHead( LinkList *L,int number )
{
        LinkList p;
        int newdata;
        
        (*L) = (LinkList)malloc(sizeof(Node));
        (*L)->next = NULL;
        
        
        for( int i = 1;  i < number  ;  i++ )
        {
                p = (LinkList)malloc(sizeof(Node));
                scanf("%d",&newdata);
                p -> data = newdata;
                p -> next = (*L)->next;
                (*L) -> next = p;
        }
        
}


In function 'main':
[Error] expected declaration specifiers or '...' before '&' token
[Error] expected declaration specifiers or '...' before numeric constant

最佳答案
2020-11-16 19:53:16
//通过传递指针的指针返回结果,不需要返回值,因此声明成void
void CreateListHead(LinkList *L,int number );


int main (void)
{
        //LinkList 定义的本身是个指针,LinkList * 则是指针的指针
        //这里应该是LinkList
        //LinkList * L;
        LinkList L;
        //指针的指针再取址就是指针的指针的指针了。
        CreateListHead(&L,3);
        
        return 0;
}

/*
函数的定义要和函数声明同形
你的定义个声明不同形
LinkList CreateListHead ();   
LinkList CreateListHead( LinkList *L,int number )
*/
void CreateListHead(LinkList *L,int number )
{
        LinkList p;
        int newdata;
        
        (*L) = (LinkList)malloc(sizeof(Node));
        (*L)->next = NULL;
        
        
        for( int i = 1;  i < number  ;  i++ )
        {
                p = (LinkList)malloc(sizeof(Node));
                scanf("%d",&newdata);
                p -> data = newdata;
                p -> next = (*L)->next;
                (*L) -> next = p;
        }
        
}

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-16 19:53:16 | 显示全部楼层    本楼为最佳答案   
//通过传递指针的指针返回结果,不需要返回值,因此声明成void
void CreateListHead(LinkList *L,int number );


int main (void)
{
        //LinkList 定义的本身是个指针,LinkList * 则是指针的指针
        //这里应该是LinkList
        //LinkList * L;
        LinkList L;
        //指针的指针再取址就是指针的指针的指针了。
        CreateListHead(&L,3);
        
        return 0;
}

/*
函数的定义要和函数声明同形
你的定义个声明不同形
LinkList CreateListHead ();   
LinkList CreateListHead( LinkList *L,int number )
*/
void CreateListHead(LinkList *L,int number )
{
        LinkList p;
        int newdata;
        
        (*L) = (LinkList)malloc(sizeof(Node));
        (*L)->next = NULL;
        
        
        for( int i = 1;  i < number  ;  i++ )
        {
                p = (LinkList)malloc(sizeof(Node));
                scanf("%d",&newdata);
                p -> data = newdata;
                p -> next = (*L)->next;
                (*L) -> next = p;
        }
        
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-17 17:55:25 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;
//关于ElemType:它是element type(“元素的类型”)的简化体。
//可以是任何数据类型,这里是int型  

typedef struct Node
{
        int data;
        struct Node * next;
} Node ;

typedef struct Node* LinkList;
//link:链接    list:目录

void GetElem (LinkList L , int i , int * e)
{
        int k                                                                              ;
        LinkList p                                                                         ;
        * e = -1                                                                           ;
        if(L && i > 0) {
                for(k = 1 , p = L ; p -> next && k < i ; k ++ , p = p -> next)             ;
                if(k == i) * e = p -> data                                                 ;
        }
}

void ListInsert(LinkList L , int i , int e)
{
        int k                                                                              ;
        LinkList p , r                                                                     ;
        if(L && i > 0) {
                for(k = 1 , r = L ; r -> next && k < i ; k ++ , r = r -> next)             ;
                p = (LinkList) malloc(sizeof(Node))                                        ;
                p -> data = r -> data                                                      ;
                p -> next = r -> next                                                      ;
                r -> data = e                                                              ;
                r -> next = p                                                              ;
        }
}

LinkList ListDelete(LinkList L , int i , int * e)
{
        int k                                                                              ;
        LinkList h , p , r                                                                 ;
        * e = -1                                                                           ;
        h = L                                                                              ;
        if(L && i > 0) {
                for(p = r = L , k = 1 ; p -> next && k < i ; r = p , p = p -> next , k ++) ;
                if(k == i) {
                        * e = p -> data                                                    ;
                        if(p == L) h = p -> next                                           ;
                        else r -> next = p -> next                                         ;
                        free(p)                                                            ;
                }
        }
        return h                                                                           ;
}

void CreateListHead(LinkList * L , int number)
{
        LinkList h , p , r                          ;
        int i                                       ;
        for(i = 0 ; i < number ; i ++ )
        {
                p = (LinkList) malloc(sizeof(Node)) ;
                p -> next = NULL                    ;
                scanf("%d" , & p -> data)           ;
                if(! i) h = p                       ;
                else r -> next = p                  ;
                r = p                               ;
        }
        * L = h                                     ;
}

void ShowList(LinkList L)
{
        if(L) {
                printf("%d" , L -> data)                                           ;
                for(L = L -> next ; L ; L = L -> next) printf(" , %d" , L -> data) ;
                printf("\n\n")                                                     ;
        } else {
                printf("链表为空。\n")                                             ;
        }
}

int main(void)
{
        LinkList L                  ;
        int e                       ;
        CreateListHead(& L ,3)      ;
        ShowList(L)                 ;
        ListInsert(L , 3 , 404)     ;
        ShowList(L)                 ;
        ListInsert(L , 1 , 808)     ;
        ShowList(L)                 ;
        L = ListDelete(L , 3 , & e) ;
        ShowList(L)                 ;
        L = ListDelete(L , 1 , & e) ;
        ShowList(L)                 ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o x x.c

D:\0002.Exercise\C>x
101
202
303
101 , 202 , 303

101 , 202 , 404 , 303

808 , 101 , 202 , 404 , 303

808 , 101 , 404 , 303

101 , 404 , 303


D:\0002.Exercise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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