鱼C论坛

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

大佬可以解决吗 链表删除后追加的元素,输出乱码

[复制链接]
发表于 2022-12-27 16:55:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//链表删除后追加的元素,输出乱码
/*比如:请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点
     4: 删除结点      5: 输出结点  6: 清空链表  0:退出
1
请输入新增结点键值和位置:1
1
请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点
     4: 删除结点      5: 输出结点  6: 清空链表  0:退出
2
请输入新增结点键值:2
请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点
     4: 删除结点      5: 输出结点  6: 清空链表  0:退出
3
请输入要查找结点的键值:2
  位置为[2]
请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点
     4: 删除结点      5: 输出结点  6: 清空链表  0:退出
4
请输入要删除结点的键值:2
  删除成功
请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点
     4: 删除结点      5: 输出结点  6: 清空链表  0:退出
5
*/
//如果运行5就输出异常
#include<stdio.h>
#include<malloc.h>
typedef struct list {
                int data;
                struct list *next;
}LIST;

void InitList( LIST **p )         /* 初始化链表 */
{
        *p=NULL;   /*编写初始化链表子程序*/
}

void InsertList1( LIST **p, int item, int rc )
/* 向链表指定位置[rc]插入元素[item] */
{
    int i;
                LIST *u, *q, *r;        /* u:新结点 q:插入点前驱 r:插入点后继 */
                u = ( LIST * )malloc( sizeof(LIST) );
                u->data = item;
                for( i = 0, r = *p ; i<rc&&r!=NULL ; i++ ) {
                        q = r;
                        r = r->next;
                }
                if(   r==*p   )                /* 插入首结点或p为空指针 */
                        *p = u;
                else
                       q->next=u;      
    u->next = r;
}

void InsertList2( LIST **p, int item )       
/* 向有序链表[p]插入键值为[item]的结点 */
{
                LIST *u, *q, *r;        /* u:新结点 q:插入点前驱 r:插入点后继 */
                u = ( LIST * )malloc( sizeof(LIST) );
                u->data = item;
                for( r = *p;  r!=NULL&& r->data < item; q = r, r = r->next );                /* 从链表首结点开始顺序查找 */
                if( r == *p )                /* 插入首结点或p为空指针 */
                          *p=u;     
                else
                        q->next = u;
    u->next = r;
}

/* 删除键值为[item]的链表结点, 返回0: 删除成功 1: 没找到 */
int DeleteList( LIST **p, int item )
{
                LIST *q, *r;                        /* q:结点前驱 r:结点后继 */
                q = *p;
                if( q == NULL )                        /* 链表为空 */
                        return 1;
                if( q->data ==   item    ) {                /* 要删除链表首结点 */
                        *p = q->next;                /* 更改链表首指针 */
                   free(r);                             /* 释放被删除结点的空间 */
                    return 0;                /* 删除成功 */
            }
            for( ;q->data!=item &&q !=NULL;r = q, q = q->next );/* 寻找键值为[item]的结点 */
if( q->data == item ) {                /* 找到结点 */
                q->next=r->next ;               /* 被删结点从链表中脱离 */
                    free( q );                /* 释放被删除结点的空间 */
                    return 0;                /* 删除成功 */
        }
    return 1;                        /* 没有指定值的结点, 删除失败 */
}

/* 查找键值为[item]的链表结点位置, 返回>=1: 找到  -1: 没找到 */
int FindList( LIST *p, int item )
{
        int i;
        for( i = 1; p->data != item && p != NULL ;    p=p->next  , i++ );/* 查找键值为[item]的结点 */
        return ( p == NULL ) ? -1 : i;        /* 找到返回[i] */
}

void OutputList( LIST *p )                /* 输出链表结点的键值 */
{
            while(  p  ) {
                   printf( "%4d", p->data );
                   p = p->next;                /* 遍历下一个结点 */
    }
    printf("\n");
}

void FreeList( LIST **p )                /* 释放链表空间 */
{
        LIST *q, *r;
        for( q = *p; q != NULL; ) {
                     r=q;   
                  q = q->next;
                       free(r);      
            }
        *p = NULL;                        /* 将链表首指针致空 */
}

int main()
{
        LIST *p;
                    int op, i, rc;
        InitList( &p );                        /* 初始化链表 */
        while( 1 )
        {
                                printf( "请选择操作  1:指定位置追加  2: 升序追加  3: 查找结点\n" );
                                printf( "     4: 删除结点      5: 输出结点  6: 清空链表  0:退出\n" );
                                fflush( stdin );        /* 清空标准输入缓冲区 */
                                scanf( "%d", &op );
                                switch( op ) {
                                        case 0:                /* 退出 */
                                                return -1;
                                        case 1:                /* 指定位置追加结点 */
                                                printf( "请输入新增结点键值和位置:" );
                                                scanf( "%d%d", &i, &rc );
                                                 InsertList1(&p,i,rc) ;
                                                break;
                                        case 2:                /* 按升序追加结点 */
                                                printf( "请输入新增结点键值:" );
                                                scanf( "%d", &i );
                                                InsertList2( &p, i );
                                                break;
                                        case 3:                /* 查找结点 */
                                                printf( "请输入要查找结点的键值:" );
                                                scanf( "%d", &i );
                                                rc = FindList(p,i) ;
                                                if( rc > 0 )
                                                        printf( "  位置为[%d]\n", rc );
                                                else
                                    printf( "  没找到\n" );
                                                break;
                                        case 4:                /* 删除结点 */
                                                printf( "请输入要删除结点的键值:" );
                                                scanf( "%d", &i );
                                                rc = DeleteList(&p,i);
                                                if( rc == 0 )
                                                        printf( "  删除成功\n", rc );
                                                else
                                    printf( "  没找到\n" );
                                                break;
                                        case 5:                /* 输出结点 */
                                                printf( "\n链表内容为:\n" );
                                                OutputList(p) ;
                                                break;
                                        case 6:                /* 清空链表 */
                                                FreeList(&p) ;
                                break;
                                }
                        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-27 22:02:08 | 显示全部楼层
代码格式太乱,自己把代码格式化下说不定自己都找到问题 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-30 19:09:11 | 显示全部楼层
int DeleteList( LIST **p, int item )
{
                LIST *q, *r;                        /* q:结点前驱 r:结点后继 */
                q = *p;
                if( q == NULL )                        /* 链表为空 */
                        return 1;
                if( q->data ==   item    ) {                /* 要删除链表首结点 */
                        *p = q->next;                /* 更改链表首指针 */
                          free(q);// free(r);                             /* 释放被删除结点的空间 *////////////////////////////////////////////////////////r没有被赋值
                    return 0;                /* 删除成功 */
            }
            for( ;q->data!=item &&q !=NULL;r = q, q = q->next );/* 寻找键值为[item]的结点 */
if( q->data == item ) {                /* 找到结点 */
                    r->next=q->next///////////q->next=r->next ;               /* 被删结点从链表中脱离 *////////////////////////////////////////////////////r = q, q = q->next ;此时r是q结点前驱,q->next是q结点后继 
                    free( q );                /* 释放被删除结点的空间 */
                    return 0;                /* 删除成功 */
        }
    return 1;                        /* 没有指定值的结点, 删除失败 */
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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