边边sk 2021-10-09 23:49 采纳率: 66.7%
浏览 22
已结题

单链表的基本操作—为什么运行后没有打印的东西呢?

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//声明节点结构
typedef struct Link
{
int data;
struct Link *next;
}link;
//初始化
void ListInitiate(link **head)
{
*head = (link *) malloc (sizeof(link));
(head)->next = NULL;
}
//求当前数据元素的个数
/

循环前,指针变量p指向头节点,计数变量size等于0.
循环的结束条件为p->next != NULL,循环中每次让指针p指向它的直接后继结点,让size加1.
最后函数返回计数值size
*/
int ListLength(link *head)
{
link *p = head;
int size = 0;

while(p->next != NULL)
{
    p = p->next;
    size++;
}
return size;

}
//插入
int ListInsert(link *head, int i, int x)
{
link *p, *q;
int j;

p = head;
j = -1;
while(p->next !=NULL && j < (i-1))
{
    p = p->next;
    j++;
}

if(j != i-1)
{
    printf("插入元素位置参数错!");
    return 0;
}

q = (link *)malloc(sizeof(link));
q->data = x;

q->next = p->next;
p->next = p;
return 1;

}
//删除
int ListDelete(link *head,int i,int *x)
{
link *p, *s;
int j;

p = head;
j = -1;
while(p->next != NULL && p->next->next != NULL && j < i-1)
{
    p = p->next;
    j++;
}

if(j != i-1)
{
    printf("删除元素位置参数错!");
    return 0;
}

s = p->next;
*x = s->data;
p->next = p->next->next;
free(s);
return 1;

}
//取数据元素
int ListGet(link *head,int i,int *x)
{
link *p;
int j;

p = head;
j = -1;
while(p->next != NULL && j<i)
{
    p = p->next;
    j++;
}

if(j != 0)
{
    printf("取元素位置参数错!");
    return 0;
}

*x = p->data;
return 1;

}
//撤销单链表
void Destory(link **head)
{
link *p, *p1;

p = *head;
while(p != NULL)
{
    p1 = p;
    p = p->next;
    free(p1);
}
*head = NULL;

}

int main(void)
{
link *head;
int i,x;

ListInitiate(&head);
for(i=0; i<10; i++)
{
    ListInsert(head,i,i+1);
}

ListDelete(head,4,&x);
for(i=0; i<ListLength(head); i++)
{
    ListGet(head,i,&x);
    printf("%d   ",x);
}

Destory(&head);

return 0;

}

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2021-10-10 11:42
    关注

    修改如下,修改见注释处,供参考:

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    //声明节点结构
    typedef struct Link
    {
        int data;
        struct Link *next;
    }link;
    //初始化
    void ListInitiate(link **head)
    {
        (*head) = (link *) malloc (sizeof(link));
        (*head)->next = NULL;
    }
    //求当前数据元素的个数
    int ListLength(link *head)
    {
        link *p = head->next;     //link *p = head;
        int size = 0;
        while(p != NULL)          //while(p->next != NULL)
        {
            size++;
            p = p->next;
        }
        return size;
    }
    
    //插入
    int ListInsert(link **head, int i, int x)//int ListInsert(link *head, int i, int x)
    {
        link *p, *q;
        int j;
        p = (*head);
        j = 0;                             //j = -1;
        while(p->next !=NULL && j<(i-1))
        {
            p = p->next;
            j++;
        }
                                           //if(j > i-1)//if(j != i-1)
                                           //{
                                           //    printf("插入元素位置参数错!");
                                           //    return 0;
                                           //}
        q = (link *)malloc(sizeof(link));
        q->data = x;
        q->next = p->next;
        p->next = q;                       //p->next = p;
        return 1;
    }
    //删除
    int ListDelete(link *head,int i,int *x)
    {
        link *p, *s;
        int j;
        p = head;
        j = 0;                           //j = -1;
        while(p->next != NULL && j < i-1 )//while(p->next != NULL && p->next->next != NULL && j < i-1)
        {
            p = p->next;
            j++;
        }
        if(!p->next || i< 1)             //if(j != i-1)
        {
            printf("删除元素位置参数错!");
            *x = -1;
            return 0;
        }
        s = p->next;
        *x = s->data;
        p->next = p->next->next;
        free(s);
        return 1;
    }
    //取数据元素
    int ListGet(link *head,int i,int *x)
    {
        link *p;
        int   j;
        p = head;
        j = 0;                   //j = -1;
        while(p != NULL && j < i)//while(p->next != NULL && j < i)
        {
            j++;
            p = p->next;
        }
        if(!p || i < 1)         //if(j != 0)
        {
            printf("取元素位置参数错!");
            *x = -1;
            return 0;
        }
        *x = p->data;
        return 1;
    }
    //撤销单链表
    void Destory(link **head)
    {
        link *p, *p1;
        p = (*head)->next;  // p = *head;
        while(p != NULL)
        {
             p1= p;
             p = p->next;
             free(p1);
        }
        free((*head));     //修改
        (*head) = NULL;
    }
    
    int main(void)
    {
        link *head;
        int i,k,x;         //修改
        ListInitiate(&head);
        
        for(i=0; i<10; i++)
        {
            ListInsert(&head,i+1,i+1);//修改
        }
    
        ListDelete(head,4,&x);
        printf("Del:%d\n",x);  //修改
        
        k = ListLength(head);
    
        for(i=0; i < k; i++)
        {
            ListGet(head,i+1,&x); //修改
            printf("%d   ",x);
        }
    
        Destory(&head);
        
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 10月9日

悬赏问题

  • ¥20 深信服vpn-2050这台设备如何配置才能成功联网?
  • ¥15 Arduino的wifi连接,如何关闭低功耗模式?
  • ¥15 Android studio 无法定位adb是什么问题?
  • ¥15 C#连接不上服务器,
  • ¥15 angular项目错误
  • ¥20 需要帮我远程操控一下,运行一下我的那个代码,我觉得我无能为力了
  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)