大佬可以解决吗 链表删除后追加的元素,输出乱码
//链表删除后追加的元素,输出乱码/*比如:请选择操作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;
}
}
}
代码格式太乱,自己把代码格式化下说不定自己都找到问题 了。 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]