爱问知识人 爱问教育 医院库

C语言编程问题

首页

C语言编程问题

20. 建立一个链表,每个结点包括的成员为:职工号、工资。用一个creat()函数 来建立链表,用list()函数来输出数据。5个职工号为101,103,105,107,109。在此基础上,新增加一个职工的数据,按职工号的顺序插入链表,新插入的职工号为106。写一函数insert来插入新结点。然后再写一函数delete,用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表。

提交回答
好评回答
  • 2009-01-24 21:59:24
      #include 
    #include 
    #include 
    struct zg
    {
    	char num[10];
    	int salary;
    	struct zg *next;
    };
    void main()
    {
    	struct zg* head=NULL,*q;
    	struct zg* creat();
    	void list(struct zg *);
    	struct zg* insert(struct zg *h,struct zg *q);
    	struct zg* del(struct zg *h,char*q);
    	char snum[10];
    	head=creat();
    	printf("输出链表内容如下:\n");
    	list(head);
    	q=(struct zg*)malloc(sizeof(struct zg));
    	printf("输入新的职工号和工资:");
    	scanf("%s",q->num);
    	scanf("%d",&q->salary);
    	q->next=NULL;
    	head=insert(head,q);
    	printf("插入结点后的链表内容如下:\n");
    	list(head);
    	printf("输入被删除的职工号:");
    	scanf("%s",snum);
    	head=del(head,snum);
    	printf("删除结点后的链表内容如下:\n");
    	list(head);	
    }
    struct zg* creat()
    {
    	struct zg *h=NULL,*cur=NULL,*last=NULL;
    	int count=0;
    	while(1)
    	{
    		cur=(struct zg*)malloc(sizeof(struct zg));
    		printf("Input the %dth data:",count+1);
    		scanf("%s",cur->num);
    		scanf("%d",&cur->salary);
    		cur->next=NULL;
    		count++;
    		
    		if (strcmp(cur->num,"0")==0) //输入是否终止
    		{
    			free(cur);
    			break;
    		}
    		
    		if(count==1)  // 第1个结点吗?
    			h=cur;
    		else
    			last->next=cur;
    		last=cur;
    	}
    	return h;
    }
    void list(struct zg *h)
    {
    	struct zg *cur;
    	cur=h;
    	while(cur!=NULL)
    	{
    		printf("%s   %8d\n",cur->num,cur->salary);
    		cur=cur->next;//指向下一个结点
    	}
    }
    struct zg* insert(struct zg *h,struct zg *q)
    {
    	struct zg *p1,*p2;
    	p1=p2=h;
    	if(h==NULL)
    		h=q;//链空时
    	else if(strcmp(q->num,h->num)next=h;
    		h=q;		
    	}
    	else
    	{
    		while(strcmp(q->num,p1->num)>0 && p1->next!=NULL)
    		{
    			p2=p1;
    			p1=p1->next;
    		}
    		if( strcmp(q->num,p1->num)next=p1;
    			p2->next=q;
    		}
    		else
    		{  //插入链尾
    			p1->next=q;
    			q->next=NULL;
    		}
    	}
    	return h;
    }
    struct zg* del(struct zg *h,char *s)
    {
    	struct zg *p1,*p2;
    	
    	p1=p2=h;
    	//查找待删除结点的位置
    	while( (strcmp(s,p1->num)!=0)&& p1->next!=NULL)
    	{
    		p2=p1;
    		p1=p2->next;
    	}
    	if(strcmp(s,p1->num)!=0)
    		printf("没有找到该数据结点!\n");
    	else
    	{
    		if(h==p1) //删除第1个结点
    		{
    			h=p1->next;
    			free(p1);
    		}
    		else // 删除的结点不是首结点
    		{
    			p2->next=p1->next;
    			free(p1);
    		}
    	}	
    	return h;
    }
    。
      

    奥***

    2009-01-24 21:59:24

类似问题

换一换
  • 软件 相关知识

  • 电脑网络技术
  • 电脑网络

相关推荐

正在加载...
最新问答 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):