夙惜言 发表于 2020-11-16 19:53:15

关于链表的问题

好长时间没敲了
都忘的差不多了
不知道为什么会这样 是我写错了吗
能说详细点吗

#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':
expected declaration specifiers or '...' before '&' token
expected declaration specifiers or '...' before numeric constant

xieglt 发表于 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;
        }
       
}

jackz007 发表于 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>
页: [1]
查看完整版本: 关于链表的问题