第四周项目一C/C++建立单链表

本文介绍使用C语言实现单链表的数据结构,通过头插法和尾插法建立单链表,并展示了如何遍历及销毁单链表的具体过程。
/*  
*Copyright (c) 2017,烟台大学计算机与控制工程学院  
*All rights reserved.  
*文件名称:项目1——建立单链表  
*作    者:高晶  
*完成日期:2017年9月26日  
*版 本 号:v1.0  
* 定义单链表存储结构,用头插法和尾插法建立单链表,并显示建立好以后的结果。 
*/  
#include <stdio.h>
#include <malloc.h>
typedef int ElemType;
typedef struct LNode        //定义单链表结点类型
{
    ElemType data;
    struct LNode *next;     //指向后继结点
} LinkList;

void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表
void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表
void DestroyList(LinkList *&L); //销毁单链表
void DispList(LinkList *L); //输出单链表

int main()
{
    LinkList *L1, *L2;
    ElemType a[8]= {7, 9, 8, 2, 0, 4, 6, 3};
    CreateListF(L1, a, 8);
    printf("头插法建表结果:");
    DispList(L1);
    CreateListR(L2, a, 6);
    printf("尾插法建表结果:");
    DispList(L2);
    DestroyList(L1);
    DestroyList(L2);
    return 0;
}
void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表
{
    LinkList *s;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点
    L->next=NULL;
    for (i=0; i<n; i++)
    {
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
        s->data=a[i];
        s->next=L->next;            //将*s插在原开始结点之前,头结点之后
        L->next=s;
    }
}
void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表
{
    LinkList *s,*r;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点
    L->next=NULL;
    r=L;                    //r始终指向终端结点,开始时指向头结点
    for (i=0; i<n; i++)
    {
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
        s->data=a[i];
        r->next=s;          //将*s插入*r之后
        r=s;
    }
    r->next=NULL;           //终端结点next域置为NULL
}

void DestroyList(LinkList *&L)  //销毁单链表
{
    LinkList *p=L,*q=p->next;
    while (q!=NULL)
    {
        free(p);
        p=q;
        q=p->next;
    }
    free(p);    //此时q为NULL,p指向尾结点,释放它
}

void DispList(LinkList *L)  //输出单链表
{
    LinkList *p=L->next;
    while (p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}

运行结果


下面三个程序都是用来实现单链表的定义和操作,每个程序均由头文件、实现文件和主文件。第个程序中的单链表结点为结构类型,结点的值为整型;第二个程序中的单链表结点同样为结构类型,结点的值为 student 结构类型;第三个程序中的单链表采用类的定义, 操作函数为类中的成员函数,单链表中每个结点的值为整型。 整个程序如下: //头文件 linklist1.h //定义 ElemType 为 int typedef int ElemType; //单链表中结点的类型struct LNode { ElemType data; //值域LNode* next; //指针域 }; //初始化单链表 void InitList(LNode*& HL); //清空单链表 void ClearList(LNode*& HL); //求单链表长度 int ListSize(LNode* HL); //检查单链表是否为空 bool ListEmpty(LNode* HL); //返回单链表中指定序号的结点值 ElemType GetElem(LNode* HL, int pos); //遍历单链表 void TraverseList(LNode* HL); //从单链表中查找元素 bool FindList(LNode* HL, ElemType& item); //更新单链表中的给定元素 bool UpdateList(LNode* HL, const ElemType& item); //向单链表插入元素 void InsertList(LNode*& HL, const ElemType& item, int mark); //从单链表中删除元素 bool DeleteList(LNode*& HL, ElemType& item, int mark); //对单链表进行有序输出 void OrderOutputList(LNode* HL, int mark); //实现文件 linklist1.cpp #include<iostream.h> #include<stdlib.h> #include"linklist1.h" //初始化单链表 void InitList(LNode*& HL) { HL=NULL; } //清空单链表 void ClearList(LNode*& HL) { LNode *cp, *np; cp=HL; while(cp!=NULL) { np=cp->next; delete cp; cp=np; } HL=NULL; } //求单链表长度 int ListSize(LNode* HL) { LNode* p=HL; int i=0; while(p!=NULL) { i++; p=p->next; } return i; } //检查线性表是否为空 bool ListEmpty(LNode* HL) { return (HL==NULL); } //返回单链表中指定序号的结点值 ElemType GetElem(LNode* HL, int pos) { if(pos<1) { cerr<<"pos is out range!"<<endl; exit(1); } LNode* p=HL; int i=0; while(p!=NULL) { i++; if(i==pos) break; p=p->next; } if(p!=NULL) return p->data; else { cerr<<"pos is out range!"<<endl; exit(1); } } //遍历单链表 void TraverseList(LNode* HL) { LNode* p=HL; while(p!=NULL) { cout<<p->data<<" "; p=p->next; } cout<<endl; } //从单链表中查找元素 bool FindList(LNode* HL, ElemType& item) { LNode* p=HL; while(p!=NULL) if(p->data==item) { item=p->data; return true; } else p=p->next; return false; } //更新单链表中的给定元素 bool UpdateList(LNode* HL, const ElemType& item) { LNode* p=HL; while(p!=NULL) //查找元素 if(p->data==item) break; else p=p->next; if(p==NULL) return false; else { //更新元素 p->data=item; return true; } } //向单链表插入元素 void InsertList(LNode*& HL, const ElemType& item, int mark) { //建立个值为 item 的新结点 LNode* newptr; newptr=new LNode; newptr->data=item; //向表头插入结点if(mark>0) { newptr->next=HL; HL=newptr; } //向表尾插入结点else if(mark<0) { if(HL==NULL) {newptr->next=NULL; HL=newptr;} else { LNode* p=HL; while(p->next!=NULL) p=p->next; p->next=newptr; newptr->next=NULL; } } //插入到合适位置else { LNode* cp; LNode* ap; ap=NULL; cp=HL; while(cp!=NULL) { if(item<cp->data) break; else {ap=cp; cp=cp->next;} } if(ap==NULL) {newptr->next=HL; HL=newptr;} else {newptr->next=cp; ap->next=newptr;} } } //从单链表中删除元素 bool DeleteList(LNode*& HL, ElemType& item, int mark) { if(HL==NULL) return false; //删除表头结点if(mark>0) { LNode* p=HL; item=HL->data; HL=HL->next; delete p; return true; } //删除表尾结点 else if(mark<0) { LNode *cp=HL, *ap=NULL; while(cp->next!=NULL) { ap=cp; cp=cp->next; } if(ap==NULL) HL=NULL; else ap->next=cp->next; item=cp->data; delete cp; return true; } //删除值为 item 结点else { LNode *cp=HL, *ap=NULL; while(cp!=NULL) if(cp->data==item) break; else {ap=cp; cp=cp->next;} if(cp==NULL) return false; else { if(ap==NULL) HL=HL->next; else ap->next=cp->next; item=cp->data; delete cp; return true; } } } //对单链表进行有序输出 void OrderOutputList(LNode* HL, int mark) { if(HL==NULL) {cout<<"链表为空!"<<endl; return;} //建立新的单链有序表的表头结点 LNode* head=new LNode; //head 为新建有序表的表头指针head->data=HL->data; head->next=NULL; //根据 HL 单链表生成 head 单链有序表for(LNode* p=HL->next; p; p=p->next) { LNode* q=new LNode; q->data=p->data; LNode *cp=head, *ap=NULL; //为向 head 单链表插入 q 结点而顺序查找合适位置while(cp) { if(mark==1) { if(q->data<cp->data) break; else {ap=cp; cp=cp->next;} } else { if(q->data>cp->data) break; else {ap=cp; cp=cp->next;} } } //把 q 结点插入 head 有序单链表中if(ap==NULL) {q->next=head; head=q;} else { q->next=cp; ap->next=q; } } //遍历 head 有序单链表TraverseList(head); //清除 head 有序单链表 ClearList(head); } //主文件 linkmain1.cpp #include<iomanip.h> #include"linklist1.h" void main() { LNode* a; InitList(a); int i; ElemType x; //依次向单链表 a 表尾插入 5 个整数元素 cout<<"从键盘输入 5 个整数:"; for(i=0; i<5; i++) { cin>>x; InsertList(a,x,-1); } //依次向单链表 a 表头插入 2 个整数元素 cout<<"从键盘输入 2 个整数:"; cin>>x; InsertList(a,x,1); cin>>x; InsertList(a,x,1); //按不同次序遍历输出单链表 a TraverseList(a); OrderOutputList(a,1); OrderOutputList(a,0); //把单链表 a 中的所有元素依次有序插入到个新单链表 b 中LNode* b; InitList(b); for(LNode* p=a; p; p=p->next) InsertList(b, p->data, 0); //输出单链表 b TraverseList(b); //从单链表 a 中分别删除表头、表尾、给定值结点if(DeleteList(a,x,1)) cout<<"Delete success!"<<endl; else cout<<"Delete fail!"<<endl; if(DeleteList(a,x,-1)) cout<<"Delete success!"<<endl; else cout<<"Delete fail!"<<endl; cout<<"从键盘上输入个待删除的整数:"; cin>>x; if(DeleteList(a,x,0)) cout<<"Delete success!"<<endl; else cout<<"Delete fail!"<<endl; //输出单链表 a TraverseList(a); } 打印程序运行结果:
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值