鱼C论坛

 找回密码
 立即注册
查看: 2431|回复: 5

C语言链表删除问题

[复制链接]
发表于 2014-2-7 17:45:11 | 显示全部楼层 |阅读模式
15鱼币
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LEN sizeof(struct student)  // student结构的大小

struct student *creat();   // 创建链表
struct student *del( struct student *head, int num);  // del函数用于删除结点, *head即链表
                                                      // 的头指针, num是要删除的结点num。
void print(struct student *head);   // 打印链表

struct student
{
      int num;
      float score;
      struct student *next;
};

int n;    // 全局变量,用来记录存放了多少数据。

void main()
{
      struct student *stu, *p;
      int n;

      stu = creat();
      p = stu;
      print( p );    //  这个是 把创建好的链表打印出来,

      printf("Please enter the num to delete: ");
      scanf("%d", &n);
      print( del(p, n) );        // 那这里是什么意思啊?函数里面的函数,        
      
      printf("\n\n");
      system("pause");
}

struct student *creat()
{
      struct student *head;
      struct student *p1, *p2;
  
      p1 = p2 = (struct student *)malloc(LEN);  // LEN是student结构的大小

      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 = p1;
            p1 = (struct student *)malloc(LEN);

            printf("\nPlease enter the num :");
            scanf("%d", &p1->num);
            printf("Please enter the score :");
            scanf("%f", &p1->score);
      }

      p2->next = NULL;

      return head;
}

void print(struct student *head)
{
      struct student *p;
      printf("\nThere are %d records!\n\n", n);

      p = head;
      if( head )
      {
            do
            {
                  printf("学号为 %d 的成绩是: %f\n", p->num, p->score);
                  p = p->next;
            }while( p );
      }
}

struct student *del( struct student *head, int num)
{
      struct student *p1, *p2;
      
      if( NULL == head ) // 如果头结点指向NULL,这是一个空链表。纯属忽悠T_T
      {
            printf("\nThis list is null!\n");
            goto END;
      }

      p1 = head;
      while( p1->num != num && p1->next != NULL)//这一句是什么意思?不是要找==num一样的数之后再删除的吗?这里怎么写个 != 
      {                                                    
            p2 = p1;
            p1 = p1->next;
      }
      if( num == p1->num )
      {
            if( p1 == head )      // 当将要删除的结点位于头结点的时候
            {
                  head = p1->next;
            }
            else                  // 一般情况   ,  这个 一般情况,很难理解,求详解————
            {
                  p2->next = p1->next; 
            }

            printf("\nDelete No: %d succeed!\n", num);
            n = n-1; // n是作为一个全局变量,用来记录链表的数据数。
      }
      else
      {
            printf("%d not been found!\n", num);
      }

END:
      return head;
}
问题都在上面了 ,  求解答,,

最佳答案

查看完整内容

print( del(p, n) ); // 那这里是什么意思啊?函数里面的函数, -> 先执行 del 删除了 节点之后 ,再打印 链表。 [*]while( p1->num != num && p1->next != NULL)//这一句是什么意思?不是要找==num一样的数之后再删除的吗?这里怎么写个 != [*] { [*] p2 = p1; [*] p1 = p1->next; [*] } 这个地方 是找到 节点所在的位置。 同时 p2 指向找到的节点。 p1 指向 找到节点的下一 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-7 17:45:12 | 显示全部楼层
本帖最后由 Frank_Wang 于 2014-2-7 23:23 编辑

print( del(p, n) );        // 那这里是什么意思啊?函数里面的函数, -> 先执行 del 删除了 节点之后 ,再打印 链表


  • while( p1->num != num && p1->next != NULL)//这一句是什么意思?不是要找==num一样的数之后再删除的吗?这里怎么写个 !=
  •       {
  •             p2 = p1;
  •             p1 = p1->next;
  •       }
这个地方 是找到 节点所在的位置。 同时 p2 指向找到的节点。 p1 指向 找到节点的下一个节点.

while 里面的 表达式 表示的 就是 判断 p1 的num 是否 等于 num 并且判断 p1 是否是最后一个节点.


如果p1 的num 等于 num, 或者 p1 是最后一个节点,就会跳出循环。

if( p1 == head )      // 当将要删除的结点位于头结点的时候
{
         head = p1->next;
}
else                  // 一般情况   ,  这个 一般情况,很难理解,求详解————
{
p2->next = p1->next;
            }
这里是把 p2 指向的节点 指向 p1 的下一个节点, num 这个节点跳过了。所以就删除了那个节点。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-2-7 19:22:43 | 显示全部楼层
不要沉了啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-8 00:52:40 | 显示全部楼层
给你个链表的增删改查代码(我自己写的)参考下O(∩_∩)O哈!
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define LEN sizeof(struct student)
struct student *create();//创建链表
struct student *del(struct student *head,int num);//删除链表中数字 (链表头指针,要删除的学号)
struct student *insert(struct student *head,struct student *head_2);//网链表中加元素(链表头指针,要加的那个的)
void print(struct student *head);//输出链表
struct student *clear(struct student *head);//清空链表
void change(struct student *head,int num,float score);//更改链表数据

struct student
{
        long int num;
        float score;
        struct student *next;
};
int n;
char ch;
int main()
{
        struct student *head,head_2;
        int num,i;
        float score;
        printf("请先建立一个链表!(要结束请在number处输入0)\n");
        head = create();
s:        setbuf(stdin,NULL);
        printf("---------------------------------------------------------\n");
        printf("请选择要的操作:\n");
        printf("1.打印记录     ");
        printf("2.插入记录     ");
        printf("3.删除记录     \n");
        printf("4.更改记录     ");
        printf("5.清除记录     ");
        printf("6.退出程序     \n");
        printf("---------------------------------------------------------\n");
        scanf("%d",&i);
        switch(i)//根据用户输入的不同数字来执行不同的代码
        {
        case 1:
                print(head);
                goto s;
                break;
        case 2:
s4:            setbuf(stdin,NULL);
                printf("what number are you want to insert:");
                scanf("%d",&head_2.num);
                        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s4;
                        }
                }
s5:                setbuf(stdin,NULL);
                printf("what score are you want to insert:");
                scanf("%f",&head_2.score );
                        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s5;
                        }
                }
                head = insert(head,&head_2);
                goto s;
                break;
        case 3:
s6:         setbuf(stdin,NULL);
                printf("please putinto the number you want to delete:");
                scanf("%ld",&num);
                        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s6;
                        }
                }
                head = del(head,num);
                goto s;
                break;
        case 4:
s7:                setbuf(stdin,NULL);
                printf("Please putinto the number you want to change:");
                scanf("%d",&num);
                        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s7;
                        }
                }
s8:                setbuf(stdin,NULL);
                printf("Please putinto the score you want to save:");
                scanf("%f",&score);
                        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s8;
                        }
                }
                change(head,num,score);
                break;
        case 5:
                head=clear(head);
                break;
        case 6:
                return 0;
                break;
        default:
                printf("对不起,你的输入有误,请重新输入!");
                goto s;
                break;
        }
        
        goto s;
}
struct student *create()
{
        struct student *head;
        struct student *p1,*p2;
s:        setbuf(stdin,NULL);
        head = NULL;
        p1 = p2 = (struct student *)malloc(LEN);
        printf("Please purinto student's munber:");
        scanf("%ld",&p1->num );
                while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s;
                        }
                }
s1:        printf("Please putinto student's score:");
        setbuf(stdin,NULL);
        scanf("%f",&p1->score );
        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s1;
                        }
                }
        n = 0;
        while(p1->num )
        {
        n++;
        if(n==1)
        {
                head = p1;
        }
        else
        {
                p2->next =p1;
        }
        p2 = p1;
        p1 = (struct student *)malloc(LEN);
s2:        setbuf(stdin,NULL);
        printf("Please purinto student's munber:");
        scanf("%ld",&p1->num );
        while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s2;
                        }
                }
        if(p1->num ==0)
        {
                goto e;
        }
s3:        setbuf(stdin,NULL);
        printf("Please putinto student's score:");
        scanf("%f",&p1->score );
                while((ch=getchar())!='\n')
                {
                        if((ch>=48&&ch<=57)||ch==46)
                        {
                                ;
                        }
                        else
                        {
                                printf("你的输入有误!\n");
                                goto s3;
                        }
                }
        }
e:        p2->next =NULL;
        return head;
}

void print(struct student *head)
{
        struct student *p;
        p = head;
        printf("共有%d条记录:\n",n);
        if(head)
        {
                do
                {
                        printf("%ld号学生的成绩是:%f\n",p->num,p->score);
                        p = p->next ;
                }while(p);
        }
}

struct student *del(struct student *head,int num)
{
        struct student *p1,*p2;
        if(NULL == head)
        {
                printf("The List is NULL!\n");
                goto END;
        }
        
        
        p1 = head;
        while(p1->num !=num&&p1->next !=NULL)
        {
                p2 = p1;
                p1 = p1 ->next ;
        }
        
        if(num == p1->num )
        {
                if(p1 == head)
                {
                        head = p1 ->next ;
                        printf("Delete NO.%d succeed!\n",num);
                        n--;
                }
                else
                {
                        p2->next =p1->next ;
                        printf("Delete NO.%d succeed!\n",num);
                        n--;
                }
        }
        else
        {
                printf("NO.%d not been found!\n",num);
        }
END:    
        return head;
}

struct student *insert(struct student *head,struct student *head_2)
{
        struct student *p0,*p1,*p2;
        p0 = head_2;
        p1 = head;
        if(p1==NULL)
        {
                head = p0;
                p0->next =NULL;
        }
        else
        {
                while(p0->num >p1->num && p1->next !=NULL)
                {
                        p2 = p1;
                        p1 = p1 ->next ;
                }
                if(p0->num <= p1->num)
                {
                        if(p1 == head)
                        {
                                head = p0;
                        }
                        else
                        {
                                p2->next =p0;
                        }
                        p0->next =p1;
                }
                else
                {
                        p1->next =p0;
                        p0->next =NULL;
                }
        }
        n++;
e:        return head;
}

struct student *clear(struct student *head)
{
        head = NULL;
        n=0;
        printf("以清除全部记录!\n");
        return head;
}

void change(struct student *head,int num,float score)
{
        struct student *p1,*p2;
        if(head == NULL)
        {
                printf("This is a NULL!\n");
                goto end_2;
        }
        p1 = head;
        while(p1->num !=num&&p1->next !=NULL)
        {
                p2 = p1;
                p1=p1->next ;
        }
        if(p1->num ==num)
        {
                p1->score = score;
        }
        else
        {
                printf("NO.%d not been found!",num);
        }
end_2:
        printf("");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-13 19:06:34 | 显示全部楼层
路过看看= =!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-13 22:41:23 | 显示全部楼层
是这样的,首先你的程序拿到我这里运行,没有输入就直接快结束了,不知道这是不是你的第一个问题
1.,如果是,
请在creat()函数里面两个scanf()之前加上这个这行fflush(stdin);其作用是清除用户输入的缓冲内容,之所以不会运行scanf是因为scanf是默认从缓冲中取数,但是现在已经存在了,
这是一个很诡异的问题,scanf没有运行就过去了,曾经我也曾蛋疼过1!
如下
      printf("Please enter the num :");
fflush(stdin);
      scanf("%d", &p1->num);
fflush(stdin);
      printf("Please enter the score :");
      scanf("%f", &p1->score);

2.问题2,这样会一直不停地要你输入账号和分数下去,这样用while不对的,不可以改成别的比如 while( p1->num!=-1)当为-1的时候结束输入,具体自己改

3,程序别的问题我没有继续看了,我相信你自己还可以改,如果还有问题请继续贴出来,如果解决了可以给我鱼币麽,缺这个!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 15:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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