tyl555 发表于 2022-12-27 16:55:12

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

//链表删除后追加的元素,输出乱码
/*比如:请选择操作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
位置为
请选择操作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 )
/* 向链表指定位置插入元素 */
{
    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 )       
/* 向有序链表插入键值为的结点 */
{
                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;
}

/* 删除键值为的链表结点, 返回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 );/* 寻找键值为的结点 */
if( q->data == item ) {                /* 找到结点 */
                q->next=r->next ;               /* 被删结点从链表中脱离 */
                  free( q );                /* 释放被删除结点的空间 */
                  return 0;                /* 删除成功 */
        }
    return 1;                        /* 没有指定值的结点, 删除失败 */
}

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

ba21 发表于 2022-12-27 22:02:08

代码格式太乱,自己把代码格式化下说不定自己都找到问题 了。

jhq999 发表于 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 );/* 寻找键值为的结点 */
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;                        /* 没有指定值的结点, 删除失败 */
}
页: [1]
查看完整版本: 大佬可以解决吗 链表删除后追加的元素,输出乱码