分类：电脑/网络-软件
问题：C语言编程问题20.建立一个链表，每个结点包括的成员为：职工号、 
20. 建立一个链表，每个结点包括的成员为：职工号、工资。用一个creat() 来建立链表，用list()函数来输出数据。5个职工号为101，103，105，107，109。在此基础上，新增加一个职工的数据，按职工号的顺序插入链表，新插入的职工号为106。写一函数insert来插入新结点。然后再写一函数delete，用来删除一个结点。要求删除职工号为103的结点。打印出删除后的链表。
回答：#include <std.h>#include <malloc.h>#include <string.h>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)<0)  {   //插入链首    q->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)<=0)    {  //插入链中指点结点（p1）之前      q->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;}