} }
node *Del( node *head, int no) { node *pc,*pa,*headtemp; headtemp=pc=pa=head;
if (head=NULL) //链表为空的情况 { cout << \链表为空,无结点可删!\\t\ return NULL; }
if (pc->no==no) // 第一个结点为要删除结点的情况
{ head=pc->next; //将第二个结点的地址赋给head,
//使首结点从链表中分离出来
delete pc; //删除首结点 cout<<\删除了一个结点!\\n\ }
else //第一个结点不是要删除的结点
{ while (pc->no!=no && pc->next!=0 ) //查找要删除的结点
{ pa=pc; //当前结点地址由pc赋给pa
pc=pc->next; //pc指向下一个结点 }
if (pc==NULL) //若pc为空表示链表中无要删除的结点
cout << \链表中没有要删除的结点!\\n\ else
{ pa->next=pc->next;//将下结点地址赋给上结点,使删除结点从链表分离出来 delete pc; //删除指定结点 cout<<\删除一个结点!\\n\ }
head=headtemp; }
return head; //返回链表头指针 }
node * Insert(node * head, int no)
{ node *pc,*pa,*pn; //定义指向插入点前、后的指针pc与pa
pn=new node;
cout<<\请输入工号、姓名、应发工资、税金 :\ cin>>pn->no>>pn->name>>pn->salary>>pn->tax;
pn->fsalary=pn->salary+pn->tax; pc=pa=head;
if (head==0) //若链表为空,则新结点插入到链表首 { head=pn;
pn->next=0; return head; }
if (pc->no==no) // 第一个结点为要插入结点的情况
{ pn->next=head; head=pn; return head; }
else //第一个结点不是要插入的结点
{ while (pc->no!=no && pc->next!=0 ) //查找要插入的结点位置
{ pa=pc; //当前结点地址由pc赋给pa
pc=pc->next; //pc指向下一个结点 }
pc->next=pn; //新结点插入到链尾 pn->next=0; }
return head; //返回链表头指针 }
void main(void) //主函数 { node * head; int no;
head=Create(); //产生无序链表 Calcu(head);
Print(head); //输出无序链表 cout<<\输入要删除结点上职工工号:\\n\ cin>>no;
head=Del(head,no); //删除指定工号的结点 Print(head); //输出显示删除后的链表。 cout<<\输入要插入结点职工工号:\\n\ cin>>no;
head=Insert(head,no); //插入指定工号的结点
Print(head); //输出显示更新后的链表。 }
程序运行结果:
产生无序链表,请输入工号、姓名、应发工资、税金,以工号为-1结束:
1001
Zhang 1900 85 1002 Wang 1800 80 1003 Li 1700 70 1004 Zhou 2000 90 -1
输出链表中各结点值:
1001 Zhang 1900 85 1815 1002 Wang 1800 80 1720 1003 Li 1700 70 1630 1004 Zhou 2000 90 1910 输入要删除结点上职工工号: 1003
删除一个结点!
输出链表中各结点值:
1001 Zhang 1900 85 1815 1002 Wang 1800 80 1720 1004 Zhou 2000 90 1910 输入要插入结点职工工号: 1005
请输入工号、姓名、应发工资、税金 : 1005 wu 2100 100 输出链表中各结点值:
1001 Zhang 1900 85 1815 1002 Wang 1800 80 1720 1004 Zhou 2000 90 1910 1005 wu 2100 100 2000 (3)
# include
char name[8]; float salary,tax; float fsalary; node *next; };
void Print(const node *head) { const node *p; p=head;
cout<<\输出链表中各结点值:\
while (p!=0 )
{ cout<
void Delchain(node * head) { node * p;
p=head; //链表头指针赋给p
while (head) //当链表非空时删除结点
{ head=p->next; //将链表下一个结点指针赋给head delete p; //删除链表第一个结点 p=head; //再将头指针赋给p } }
node * Insert(node * head, node *pn)
{ node *pc,*pa; //定义指向插入点前、后的指针pc与pa pc=pa=head;
if (head==0) //若链表为空,则新结点插入到链表首 { head=pn;
pn->next=0; return head; }
if (pn->fsalary<=head->fsalary) //若新结点实发工资≥首结点实发工资, //则新结点插在链首 { pn->next=head; head=pn; return head; }
while (pc->next!=0 && pn->fsalary>=pc->fsalary) //若链表非空,则按实发工资查找插 //入点
{ pa=pc; // pc、pa移到插入点前、后结点处
pc=pc->next; }
if (pn->score >= pc->score) //新结点插入到链尾 { pc->next=pn; pn->next=0; }
else //新结点插入到链表中间 { pn->next=pc; pa->next=pn;
}
return head; //返回链表头指针 }
node *Create_sort( void)
{ node *pn,*head=0; //定义指向新结点的指针变量pn及链表头指针head int no; //定义输入职工工号临时变量no cout<<\产生一条有序链表,请输入数据,以-1结束!\\n\ cin>>no; //输入职工工号
while (no!= -1) //工号不等于-1则循环
{ pn=new node; //动态分配node类型结点空间,并将其地址赋给pn pn->no=no;
cin>>pn->name; //输入职工姓名 cin>>pn->salary; cin>>pn->tax;
pn->fsalary=pn->salary-pn->tax;
head=Insert(head,pn); //调用结点插入函数,将新结点按实发工资降序插入链表 cin>>no; //输入职工工号 }
return head; //返回链表头指针 }
void main(void) //主函数 { node * head;
head=Create_sort(); //产生一个有序链表 Print (head); //输出显示有序链表 Delchain(head); //删除整个链表 }
程序运行结果:
产生一条有序链表,请输入数据,以-1结束! 1001 Zhang 1900 85 1002 Wang 1800 80 1003 Li 1700 70 1004 Zhou 2000 90 -1
输出链表中各结点值:
1003 Li 1700 70 1630 1002 Wang 1800 80 1720 1001 Zhang 1900 85 1815 1004 Zhou 2000 90 1910
实验十一 1.实验目的