nightkk 发表于 2015-12-19 20:35:03

删除链表

我的问题是,这个程序中有一个运行不了。就是要删除的序号不是链表中有的,然后windows就会停止运行
#include
#include
#include
#define LEN sizeof(struct student)
struct student
{
int num;
float score;
struct student *next;
};
int n;//全局变量来记录链表里的个数
void main()
{
struct student *pt, *p;
int num;
struct student *creat(void); //创建一个动态链表
void print(struct student *head);//打印链表
struct student *deletes(struct student *head, int num);//删除链表
pt = creat();
p = pt;
print(pt);
printf("要删除的序号\n");
scanf("%d", &num);
print (deletes (p , num));
}
struct student *creat(void) //定义结构体类型,返回指针值,无形参的函数
{
struct student *p1, *p2, *head;
p1 = p2 = (struct student*)malloc(LEN); //开辟一个新的结点
printf("Please enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);
head = NULL;
n = 0;
while (p1 -> num)
{
n++;
if(1 == n) //注意要倒过来写
{
head = p1;
}
else
{
p2 -> next = p1; //p2 和 next 均为指针,类比二维数组,只取一次*,还是表示的地址
}
p2 = p1;
p1 = (struct student*)malloc(LEN);
printf("Please enter the num :");
scanf("%d", &p1->num);
printf("Please enter the score :");
scanf("%f", &p1->score);
}
p2 -> next = NULL;
return head;
}
struct student *deletes(struct student *head, int num)
{
struct student *p1, *p2;
if (head == NULL)
{
printf("\nThis list is null!!\n");
goto END;
}
p1 = head;
while (num != p1 -> num && p1 -> num != NULL)
{
p2 = p1;
p1 = p1 -> next;
}
if (num == p1 -> num)
{
if (head == p1)//删除的是头指针
{
head = p1 -> next;
}
else
{
p2 -> next = p1 -> next;
}
printf("\nDelete No: %d succeed!\n", num);
n = n-1;
}
else
{
printf("%d not been found!\n", num);//这里有问题,在删除的序号不是链表中的序号是,无法运行
}
END:
return head;
}
void print(struct student *head) //打印链表
{
struct student *p;
printf("\nThere are %d records!\n\n", n);
p = head;
if (head != NULL)
{
while(p != NULL)
{
printf("学号为%d的成绩是: %f\n", p -> num, p -> score);
p = p -> next;
}
}
}

默默路过 发表于 2015-12-19 20:35:04

代码写错了!
while (num != p1 -> num && p1 -> num != NULL)
{
p2 = p1;
p1 = p1 -> next;
}
红色部分 应该是 p1->next大概是你的 笔误吧!
这种问题,一般 自己 把程序跑起来,然后 局部断点调试,很容易发现的!
你的goto 有些多了! 一般来说正常情况下 很少使用goto的,正式的代码里面我
基本没使用过 goto,不方便 日后的阅读,和其他人的阅读,只是个人 建议,楼主怎么习惯怎么使!

墨愁 发表于 2015-12-20 13:08:32

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

struct yg
{
char name;
int gz;
struct yg *next;

}s;
int size=sizeof(struct yg);


intmain()
{
struct yg *list,*p1,*p2;
void printList(struct yg *list );
struct yg *del_list(struct yg *list,int salary);
char name;
int i,gz,n=0,salary;
list=NULL;
printf("请输入职工姓名和基本工资: \n");
        scanf("%s%d",name,&gz);
while(gz!=0)
{
n++;
p1=(struct yg*)malloc(size);
strcpy(p1->name,name);p1->gz=gz;p1->next=NULL;
if(n==1)
          list=p1;
else
          p2->next=p1;

p2=p1;
scanf("%s%d",name,&gz);
}
printf("请输入要删除工资节点\n");
   scanf("%d",&salary);
for(i=1;i<=n;i++)
list=del_list(list,salary);
printf("删除节点后的员工信息表\n");
printList(list);

    return 0;
}

struct yg *del_list(struct yg *list, int salary)
{
   struct yg *p1=list,*p2=list;
   while((p1->gz!=salary) && (p1->next!=NULL))
       {
          p2=p1;
          p1=p1->next;
       
       }
       
    if(p1->gz==salary)
        {   if(list==p1)
                list=p1->next;
          else
                        p2->next=p1->next;
         free(p1);
        }
       
   
       
        return list;

}
void printList(structyg *list ){
    struct yg *p = list;
    while (p != NULL){
      printf("%s%6d\n", p->name,p->gz);
      p = p->next;
    }
    printf("\n");
}

nightkk 发表于 2015-12-24 10:56:22

谢谢,我会注意的

babyrui 发表于 2016-1-11 16:08:22

看到你的提问和大神的回答,我也学到了很多,谢谢大家。 还有 这不是数据结构的问题么?
页: [1]
查看完整版本: 删除链表