2. 线性表之应用(单链表结构)

link.h:

ContractedBlock.gif ExpandedBlockStart.gif 对线性表的各种操作函数
  1#include"iostream.h"
  2//1.初始化单链表
  3void InitList(LNode *&HL)
  4ExpandedBlockStart.gifContractedBlock.gif{
  5    HL=NULL;//将单链表置空
  6}

  7//2.删除单链表中的所有结点,使之成为一个空表
  8void ClearList(LNode *&HL)
  9ExpandedBlockStart.gifContractedBlock.gif{
 10    LNode *cp,*np;
 11    cp=HL;//表头指针赋给cp
 12    while(cp!=NULL)//遍历单链表,向系统交回每一个结点
 13ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 14        np=cp->next;//保存下一个结点的指针
 15        delete cp;//删除当前结点
 16        cp=np;//使下一个结点成为当前结点
 17    }

 18    HL=NULL;//置单链表为空
 19}

 20//3.得到单链表的长度
 21int ListSize(LNode *&HL)
 22ExpandedBlockStart.gifContractedBlock.gif{
 23    LNode *p=HL;
 24    int i=0;//用来统计结点的个数
 25    while(p!=NULL)
 26ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 27        i++;
 28        p=p->next;
 29    }

 30    return i;
 31}

 32//4.检查单链表是否为空
 33int ListEmpty(LNode *HL)
 34ExpandedBlockStart.gifContractedBlock.gif{
 35    return (HL==NULL);
 36}

 37//5.得到单链表中第pos个结点中的元素
 38ElemType GetElem(LNode *HL,int pos)
 39ExpandedBlockStart.gifContractedBlock.gif{
 40    if(pos<1)
 41ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 42        cerr<<"pos is out range!"<<endl;
 43        exit(1);
 44    }

 45    LNode *p=HL;
 46    int i=0;
 47    while(p!=NULL)
 48ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 49        i++;
 50        if(i==pos) break;
 51        p=p->next;
 52    }

 53    if(p!=NULL) return p->data;
 54    else
 55ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 56        cerr<<"pos is outrange!"<<endl;
 57        exit(1);
 58    }

 59}

 60//6.遍历一个单链表
 61void TraverseList(LNode *&HL)
 62ExpandedBlockStart.gifContractedBlock.gif{
 63    LNode *p=HL;
 64    while(p!=NULL)
 65ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 66        cout<<p->data<<" ";
 67        p=p->next;
 68    }

 69    cout<<endl;
 70}

 71//9.向单链表的末尾添加一个元素
 72void InsertRear(LNode *&HL,const ElemType &item)
 73ExpandedBlockStart.gifContractedBlock.gif{
 74    LNode *newptr;
 75    newptr=new LNode;//为保存新元素分配动态结点,指向这个结点
 76    if(newptr==NULL)//若未分配到结点,则停止插入退出程序运行
 77ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 78        cerr<<"Memory allocation failare!"<<endl;
 79        exit(1);
 80    }

 81    newptr->data=item;
 82    newptr->next=NULL;
 83    if(HL==NULL)
 84        HL=newptr;
 85    else
 86ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 87        LNode *p=HL;
 88        while(p->next!=NULL)
 89            p=p->next;
 90        p->next=newptr;
 91    }

 92}

 93int Delete(LNode* &HL,const ElemType &item)
 94ExpandedBlockStart.gifContractedBlock.gif{
 95    //若单链表为空,则返回为假
 96    if(HL==NULL)
 97ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 98        cerr<<"HL is NULL"<<endl;
 99        return 0;
100    }

101    //从单链表中顺序查找与给定值相等的第一个元素,直到查找成功或失败为止
102    LNode* ap,*cp;
103    ap=NULL;cp=HL;
104    while(cp!=NULL)
105        if(cp->data==item)
106            break;
107        else
108ExpandedSubBlockStart.gifContractedSubBlock.gif        {
109            ap=cp;
110            cp=cp->next;
111        }

112    //如果查找失败则返回假
113    if(cp==NULL)
114ExpandedSubBlockStart.gifContractedSubBlock.gif    {
115        cerr<<"Deleted element is not exist!"<<endl;
116        return 0;
117    }

118    //删除查找到的结点,对表头结点和非表头结点要做不同处理
119    if(ap==NULL)  //由cp指向的被删除的结点是表头结点
120        HL=HL->next;
121    else    //由cp指向的被删除的结点是非表头结点
122        ap->next=cp->next;
123    //回收被删除的结点
124    delete cp;
125    //返回真表明删除成功
126    return 1;
127}

 Simple_Application.cpp:

 

ContractedBlock.gif ExpandedBlockStart.gif Simple_Application
 1#include"iostream.h"
 2#include"stdlib.h"
 3typedef int ElemType;
 4struct LNode
 5ExpandedBlockStart.gifContractedBlock.gif{
 6    ElemType data;
 7    LNode *next;
 8}
;
 9
10#include"link.h"
11
12void main()
13ExpandedBlockStart.gifContractedBlock.gif{
14    //构成单链表
15    LNode *head;
16    InitList(head);
17    int i,j;
18    for(i=0;i<20;i++)
19ExpandedSubBlockStart.gifContractedSubBlock.gif    {
20        j=rand()%10;
21        InsertRear(head,j);
22    }

23    //输出遍历单链表
24    TraverseList(head);
25    //从单链表中删除与键盘上输入的值相等的所有结点
26    cout<<"输一个0~9之间的一个整数:";
27    cin>>j;
28    while(Delete(head,j))
29ExpandedSubBlockStart.gifContractedSubBlock.gif    {}
30    //输出遍历单链表
31    TraverseList(head);
32    //输出单链表的长度
33    cout<<ListSize(head)<<endl;
34
35    //-----------------------------------------------
36    cout<<"********************************"<<endl;
37    int flag=1;
38    while(flag)
39ExpandedSubBlockStart.gifContractedSubBlock.gif    {
40        cout<<"退出:0 | 循环:非0"<<endl;
41        cout<<"请选择:";
42        cin>>flag;
43    }

44}

45ExpandedBlockStart.gifContractedBlock.gif/**//*
461 7 4 0 9 4 8 8 2 4 5 5 1 7 1 1 5 2 7 6
47输一个0~9之间的一个整数:1
48Deleted element is not exist!
497 4 0 9 4 8 8 2 4 5 5 7 5 2 7 6
5016
51Press any key to continue
52*/

转载于:https://www.cnblogs.com/zqblog007/archive/2008/09/12/1290085.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值