删除负数* -链表

该博客主要介绍如何编写一个C语言函数,用于删除一个带表头节点的单向链表中所有数值小于0的节点。给出的代码示例中,已经包含了建立链表、输出链表的函数,需要实现的是删除负数节点的`deleteneg`函数。此函数接收链表头指针作为参数,遍历链表并移除所有数值小于0的节点。

一个带有表头节点的链表中,链表的每个节点保存了非零的整型数据。现请编写函数删除已有的链表中所有数值小于0的节点。

说明:(1)用带表头的单向链表的方式保存数据,每一个节点的数值域保存一个非零整型数。

(2)预设代码包括主函数、建立链表函数、输出链表函数,请编写删除链表中所有数值小于0的节点的函数。

结构的定义:

struct node

{ int data;  struct node *next;

};

typedef struct node NODE;
typedef struct node * PNODE;

删除所有无效数值结点的函数原型:void deleteneg(PNODE head),

其中:参数head是带有头结点的单向链表的头指针。

程序输入:在建立链表时,每次插入到头结点后的结点数据,以0为结束。

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4.     
  5. struct node    
  6. {  
  7.     int data;    
  8.     struct node * next;    
  9. };    
  10.     
  11. typedef struct node NODE;   
  12. typedef struct node * PNODE;  
  13.    
  14. PNODE constructlist( PNODE head, int num );  
  15. void outlist( PNODE head );  
  16. void deleteneg( PNODE head );   
  17.     
  18. int main ( )    
  19. {   int num=1;    
  20.     PNODE head;    
  21.     
  22.     head = (PNODE)malloc( sizeof(NODE) );    
  23.     head->next = NULL;    
  24.     head->data = -1;    
  25.     
  26.     while ( num!=0 )    
  27.     {   scanf("%d", &num);    
  28.         if ( num!=0 )    
  29.            constructlist (head, num);    
  30.     }    
  31.     deleteneg( head );  
  32.     outlist( head );    
  33.     return 0;    
  34. }    
  35.     
  36. PNODE constructlist( PNODE head, int num )  
  37. {   PNODE p;  
  38.     p = (PNODE)malloc( sizeof(NODE) );   
  39.     p->data = num;  
  40.     p->next = head->next;   
  41.     head->next = p;  
  42.     return head;  
  43. }  
  44.   
  45. void outlist( PNODE head )    
  46. {   PNODE p;    
  47.     p = head->next;    
  48.     while ( p != NULL )    
  49.     {   printf("%d\n", p->data);    
  50.         p = p->next;    
  51.     }    
  52. }    
  53.     
  54. /* This is an example for list. Please programme your code like it.  
  55. void deleteneg( PNODE head )  
  56. {    
  57. }  
  58. */  
  59.   
  60. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */  
    /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
     
    #include <stdio.h>  
    #include <stdlib.h>  
    /*一个带有表头节点的链表中,链表的每个节点保存了非零的整型数据。
    现请编写函数删除已有的链表中所有数值小于0的节点。
    说明:(1)用带表头的单向链表的方式保存数据,每一个节点的数值域保存一个非零整型数。
    (2)预设代码包括主函数、建立链表函数、输出链表函数,
    请编写删除链表中所有数值小于0的节点的函数。
    结构的定义:
    struct node
    { int data;  struct node *next;
    };
    typedef struct node NODE;
    typedef struct node * PNODE;
    删除所有无效数值结点的函数原型:void deleteneg(PNODE head),
    其中:参数head是带有头结点的单向链表的头指针。
    程序输入:在建立链表时,每次插入到头结点后的结点数据,以0为结束。
    */ 
    struct node    
    {  
        int data;    
        struct node * next;    
    };    
        
    typedef struct node NODE;   
    typedef struct node * PNODE;  
       
    PNODE constructlist( PNODE head, int num );  
    void outlist( PNODE head );  
    void deleteneg( PNODE head );   
        
    int main ( )    
    {   int num=1;    
        PNODE head;    
        
        head = (PNODE)malloc( sizeof(NODE) );    
        head->next = NULL;    
        head->data = -1;    
        
        while ( num!=0 )    
        {   scanf("%d", &num);    
            if ( num!=0 )    
               constructlist (head, num);    
        }    
        deleteneg( head );  
        outlist( head );    
        return 0;    
    }    
        
    PNODE constructlist( PNODE head, int num )  
    {   PNODE p;  
        p = (PNODE)malloc( sizeof(NODE) );   
        p->data = num; 
        p->next = head->next;   
        head->next = p;  
        return head;  
    }  
      
    void outlist( PNODE head )    
    {   PNODE p;    
        p = head->next;    
        while ( p != NULL )    
        {   printf("%d\n", p->data);    
            p = p->next;    
        }    
    }    
        
    void deleteneg(PNODE head)
    {
        PNODE p,temp1,temp2;         
        p = head; 
        int flag = 0;
        while ( p->next != NULL )         
        {   
        	temp1 = p -> next;
            while( temp1->data <= 0)
    		{
    			p->next = temp1->next;
    			free(temp1);
    			temp1 -> data= 2;
    			if(p ->next !=NULL)
    			temp1 = p -> next;
            }
            if(p ->next !=NULL)
            p = p -> next;
        } 
        
    }

题目1:打印菱形图案** 输入一个奇数n,打印由`*`组成的n行菱形。 例如输入5: ``` * *** ***** *** * ``` *知识点:循环、对称控制* --- **题目2:字符串元音统计** 编写程序,输入一个字符串,统计其中元音字母(a, e, i, o, u)出的次数(不区分大小写)。 要求:输出格式如 `A:3 E:2 I:0 O:1 U:4` *知识点:字符串操作、数组、条件判断* --- **题目3:组合数计算器** 编写函数 `int factorial(int n)` 计算阶乘,再编写函数 `int combination(int n, int k)` 利用公式 `C(n,k) = n!/(k!(n-k)!)` 计算组合数。 最后在main函数中测试输入n=5, k=2时的结果。 *知识点:函数、递归/循环、数学公式实* --- **题目4:学生成绩管理系统** 定义结构体`Student`包含学号(int)、姓名(char[20])、成绩(float)。要求实功能: 1. 输入5个学生信息 2. 将数据保存到文件"students.dat" 3. 读取文件并找出最高分学生 4. (可选)添加排序功能 *知识点:结构体、文件操作、基础算法* --- **题目5:链表操作**一个链表,包含功能: 1. 创建包含10个随机整数的链表 2. 在指定位置插入节点 3. 删除指定值的节点 4. 反转链表 5. 打印链表 *知识点:指针、动态内存分配、数据结构* --- **题目6:迷宫路径查找** 给定10x10的二维数组表示迷宫(0=通路,1=墙壁),编写递归函数判断从起点(0,0)到终点(9,9)是否存在路径,若有则打印路径坐标。 示例迷宫: ``` int maze[10][10] = { {0,1,0,0,0,0,0,0,0,0}, {0,1,0,1,1,1,1,1,0,0}, {0,0,0,0,0,0,0,0,0,0}, // ...其余行自行定义 }; ``` *知识点:递归、回溯算法、二维数组*
04-10
# include<iostream> # include<stdio.h> # include<stdlib.h> using namespace std; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; //操作状态类型 typedef int ElemType; //数据元素类型 //定义单链表结点结构体 typedef struct Node{ ElemType data; struct Node *next; }ListNode,*LinkList; //函数声明 Status InitList(LinkList*L); Status DestroyList(LinkList *L); Status ClearList(LinkList L); int ListLength(LinkList L); Status GetElem(LinkList L,int i,ElemType*e); Status LocateElem(LinkList L,ElemType e,int*pos); Status PriorElem(LinkList L,ElemType cur_e,ElemType*pre_e); Status NextElem(LinkList L,ElemType cur_e,ElemType*next_e); Status ListInsert(LinkList L,int i,ElemType e); Status ListDelete(LinkList L,int i,ElemType *e); void PrintList(LinkList L); Status CreateList_Tail(LinkList*L,int n); Status ReverseList(LinkList L); Status SortList(LinkList L); //初始化或重置 Status InitList(LinkList *L){ if(*L !=NULL){ DestroyList(L); //若已存在则先销毁 } *L = (LinkList)malloc(sizeof(ListNode)); if (!(*L)) return ERROR; (*L)->next = NULL; return OK; } //销毁 Status DestroyList(LinkList*L){ if(*L == NULL) return ERROR; ClearList(*L); free(*L); *L = NULL; return OK; } //清空(保留头结点) Status ClearList(LinkList L){ if(L == NULL) return ERROR; ListNode *p = L->next,*q; while(p){ q = p; p = p->next; free(q); } L->next = NULL; return OK; } //链表长度 int ListLength(LinkList L){ if (L == NULL) return 0; int len = 0; ListNode *p = L->next; while(p){ len++; p = p->next; } return len; } //获取第i个元素 Status GetElem(LinkList L,int i,ElemType *e){ if (L == NULL || i < 1) return ERROR; ListNode *p = L->next; int j = 1; while (p && j < i){ p = p->next; j++; } if (!p) return ERROR; *e = p->data; return OK; } //查找元素的位序 Status LocateElem(LinkList L,ElemType e,int*pos){ if (L == NULL) return ERROR; ListNode *p = L->next; int j = 1; while (p){ if (p->data == e){ *pos = j; return OK; } p = p->next; j++; } return ERROR; } //求直接前驱 Status PriorElem(LinkList L,ElemType cur_e,ElemType *pre_e){ if (L == NULL || L->next == NULL) return ERROR; ListNode *p = L->next; if (p->data == cur_e) return ERROR; //第一个元素无前驱 while(p->next != NULL){ if (p->next->data == cur_e){ *pre_e = p->data; return OK; } p = p->next; } return ERROR; //元素不存在 } //求直接后继 Status NextElem(LinkList L,ElemType cur_e,ElemType*next_e){ if (L == NULL || L->next ==NULL) return ERROR; ListNode *p = L->next; while(p != NULL && p->next != NULL){ if(p->data == cur_e){ *next_e = p->next->data; return OK; } p = p->next; } return ERROR; } //在第i个位置插入元素 Status ListInsert(LinkList L,int i,ElemType e){ if (L == NULL || i < 1 || i > ListLength (L) + 1) return ERROR; ListNode *p = L; int j = 0; while(p && j < i - 1){ p = p->next; j++; } if (!p) return ERROR; ListNode *s = (ListNode*)malloc(sizeof(ListNode)); if (!s) return ERROR; s->data = e; s->next = p->next; p->next = s; return OK; } //删除第i个元素 Status ListDelete(LinkList L,int i,ElemType *e){ if (L == NULL || i < 1 || i > ListLength(L)) return ERROR; ListNode *p = L; int j = 0; while(p->next && j < i - 1){ p = p->next; j++; } if (!p->next) return ERROR; ListNode *q = p->next; *e = q->data; p->next = q->next; free(q); return OK; } //输出链表元素 void PrintList(LinkList L){ ListNode *p = L->next; while(p){ printf("%d" ,p->data); p = p->next; } } //尾插法建表 Status CreateList_Tail(LinkList *L, int n){ if (*L != NULL) DestroyList(L); if (InitList(L) != OK) return ERROR; ListNode *q = *L; for (int i = 0; i < n; i++) { ListNode *p = (ListNode*)malloc(sizeof(ListNode)); scanf("%d", &p->data); p->next = NULL; q->next = p; q = q->next; } return OK; } //逆序排放 Status ReverseList(LinkList L){ if (L == NULL || L->next == NULL || L->next->next == NULL) return OK; ListNode *p = L->next; //p指向第一个数据节点 L->next = NULL; //头结点暂时断开与原链表的链接 while(p){ ListNode *q = p; //保存当前节点p p = p->next; //p移至下一个节点 q->next = L->next; //将p插入到头结点之后 L->next = q; //头结点指向q } return OK; } //排序(冒泡排序) Status SortList(LinkList L){ if (L == NULL||L->next == NULL||L->next == NULL) return OK; int swapped; ListNode *p,*end = NULL; do{ swapped = 0; p = L->next; while (p->next != end){ if (p->data > p->next->data){ ElemType temp = p->data; p->data = p->next->data; p->next->data = temp; swapped = 1; } p = p->next; } end = p; }while (swapped); return OK; } int main() { LinkList L = NULL; int i,e,pos,result; int n = 1;//退出菜单的标记 cout<<"====欢迎使用链表运算小工具~~===="<<endl; cout<<"++输入对应数字指令实相应功能++"<<endl; cout<<"********1---初始化或重置链表********"<<endl; cout<<"********2---销毁链表********"<<endl; cout<<"********3---清空链表********"<<endl; cout<<"********4---链表长度********"<<endl; cout<<"********5---指定位置的元素值******"<<endl; cout<<"********6---链表已存在元素的位序******"<<endl; cout<<"********7---求输入元素的直接前驱******"<<endl; cout<<"********8---求输入元素的直接后继******"<<endl; cout<<"********9---在第i个位置插入一个元素******"<<endl; cout<<"********10---删除第i个元素******"<<endl; cout<<"********11---输出有的链表元素******"<<endl; cout<<"********12---初始化并用尾插法输入元素******"<<endl; cout<<"********13---链表的逆序存放******"<<endl; cout<<"********14---链表的排序******"<<endl; cout<<"*****输入一个负数退出程序~*****"<<endl; while(n){//n不等于0 n!=0 int s; //选菜单 cout<<"输入指令编号,(退出时输入负数):\n"; scanf("%d",&s); switch(s){ case 1: if(InitList(&L) == OK){ printf("链表初始化成功\n"); }else{ printf("初始化失败\n"); } break; case 2: if(DestroyList(&L) == OK){ printf("链表已成功销毁\n"); }else{ printf("链表不存在或尚未初始化,无法销毁\n"); } break; case 3: if (L == NULL){ printf("链表尚未初始化,先初始化\n"); }else if(ClearList(L) == OK){ printf("链表已清空\n"); }else{ printf("清空失败\n"); } break; case 4: if(L == NULL){ printf("链表尚未初始化\n"); }else{ n = ListLength(L); printf("当前链表长度为:%d\n",n); } break; case 5: if (L == NULL){ printf("链表尚未初始化\n"); }else{ printf("输入位置i:"); scanf("%d",&i); if (GetElem(L,i,&e) == OK){ printf("第%d个元素是:%d\n",i,e); }else{ printf("位置无效,",i,ListLength(L)); } } break; case 6: if(L == NULL){ printf("链表未初始化\n"); }else{ printf("输入要查找的元素:"); scanf("%d",&e); if (LocateElem(L,e,&pos) == OK){ printf("元素%d首次出在第%d位\n",e,pos); }else{ printf("元素%d不在链表中\n",e); } } break; case 7: if (L == NULL){ printf("链表未初始化\n"); }else{ printf("输入要求前驱的元素:"); scanf("%d",&e); if(PriorElem(L,e,&result) == OK){ printf("元素%d的前驱是:%d\n",e,result); }else{ if(ListLength(L) == 0){ printf("链表为空,无前驱\n"); }else if(L->next->data == e){ printf("元素%d是第一个元素,无前驱\n",e); }else{ printf("该元素不在链表中\n"); } } } break; case 8: if (L == NULL) { printf("链表未初始化。\n"); } else { printf("输入要求后继的元素: "); scanf("%d", &e); if (NextElem(L, e, &result) == OK) { printf("元素%d的后继是: %d\n", e, result); } else { n = ListLength(L); GetElem(L, n, &result); if (result == e) { printf("元素%d是最后一个元素,没有后继。\n", e); } else { printf("元素%d不在链表中,无法求后继。\n", e); } } } break; case 9: if (L == NULL) { printf("链表未初始化,先初始化。\n"); } else { printf("输入插入位置i和元素e (i e): "); scanf("%d %d", &i, &e); if (ListInsert(L, i, e) == OK) { printf("成功在第%d个位置插入元素%d。\n", i, e); } else { printf("插入失败\n"); } } break; case 10: if (L == NULL) { printf("链表未初始化。\n"); } else { printf("输入要删除的位置i: "); scanf("%d", &i); if (ListDelete(L, i, &e) == OK) { printf("已删除第%d个元素,其值为%d。\n", i, e); } else { printf("删除失败"); } } break; case 11: if (L == NULL) { printf("链表未初始化。\n"); } else if (ListLength(L) == 0) { printf("链表为空。\n"); } else { printf("链表元素为: "); PrintList(L); printf("\n"); } break; case 12: printf("输入元素个数n: "); scanf("%d", &n); printf("输入元素:"); if (CreateList_Tail(&L, n) == OK) { printf("使用尾插法成功创建含%d个元素的链表。\n", n); } else { printf("内存分配失败,创建失败。\n"); } break; case 13: if (L == NULL) { printf("链表未初始化。\n"); } else if (ListLength(L) <= 1) { printf("链表长度小于2,无需逆序。\n"); } else { if (ReverseList(L) == OK) { printf("链表逆序成功。\n"); } else { printf("逆序失败。\n"); } } break; case 14: if (L == NULL) { printf("链表未初始化。\n"); } else if (ListLength(L) <= 1) { printf("链表长度小于2,无需排序。\n"); } else { if (SortList(L) == OK) { printf("链表排序成功(升序)。\n"); } else { printf("排序失败。\n"); } } break; default: if(s<0){ n = 0; cout<<"程序退出成功,欢迎下次使用~~"<<endl; break; } else cout<<"您输入的指令有误,重新输入~"<<endl; }//switch }//while }//main 修改,为什么清空链表后再显示长度会结束运行
最新发布
10-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值