第4周项目1-建立单链表

问题及代码:

/*
*Copyright (c)2016,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:bigice.cpp
*作    者:何大冰
*完成日期:2016年9月23日
*版 本 号: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);  //输出单链表
void CreateListO(LinkList *&L,ElemType a[],int n);
int main()
{
    LinkList *L1, *L2,*L3;
    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);
    CreateListO(L3,a,8);
    printf("建立有序的单链表的结果:");
    DispList(L3);
    DestroyList(L1);
    DestroyList(L2);
    return 0;
}
void CreateListO(LinkList *&L,ElemType a[],int n)  //建立有序(升序)的单链表
{
    LinkList *s,*r;
    int i;
    L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点
    L->next=NULL;
    for (i=0; i<n; i++)
    {
        r=L; //r指向头结点
        s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
        s->data=a[i];
        s->next=NULL;
        while(r->next!=NULL && r->next->data < a[i])  //找到插入点
            r = r->next;
        s->next=r->next; //将*s插入*r之后
        r->next=s;
    }
}
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");
}



运行结果:





知识点总结:熟悉单链表的基本操作,为以后的学习打下了良好的基础。



心得体会:学会单链表的基本操作,能够自己去尝试把其具体实现步骤用代码打出来。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单链表是一种常用的数据结构,它由一系列节点组成,每个节点由一个数据元素和一个指向下一个节点的指针组成。 单链表的基本操作包括: 1. 创建一个空链表 2. 在链表头部插入一个节点 3. 在链表尾部插入一个节点 4. 在指定位置插入一个节点 5. 删除链表中的指定节点 6. 查找链表中的指定节点 7. 获取链表的长度 8. 遍历链表并输出元素 下面是单链表的基本操作的示例代码: ```python # 定义单链表节点类 class ListNode: def __init__(self, data): self.data = data self.next = None # 定义单链表类 class LinkedList: def __init__(self): self.head = None # 在链表头部插入一个节点 def insert_at_head(self, data): new_node = ListNode(data) if not self.head: self.head = new_node else: new_node.next = self.head self.head = new_node # 在链表尾部插入一个节点 def insert_at_tail(self, data): new_node = ListNode(data) if not self.head: self.head = new_node else: cur = self.head while cur.next: cur = cur.next cur.next = new_node # 在指定位置插入一个节点 def insert_at_position(self, data, position): if position <= 0 or not self.head: self.insert_at_head(data) else: new_node = ListNode(data) cur = self.head for _ in range(position-1): if not cur.next: break cur = cur.next new_node.next = cur.next cur.next = new_node # 删除链表中的指定节点 def delete_node(self, data): if not self.head: return if self.head.data == data: self.head = self.head.next else: cur = self.head while cur.next: if cur.next.data == data: cur.next = cur.next.next break cur = cur.next # 查找链表中的指定节点 def find_node(self, data): cur = self.head while cur: if cur.data == data: return True cur = cur.next return False # 获取链表的长度 def get_length(self): count = 0 cur = self.head while cur: count += 1 cur = cur.next return count # 遍历链表并输出元素 def traverse(self): cur = self.head while cur: print(cur.data, end=' ') cur = cur.next print() # 创建一个空链表 linked_list = LinkedList() # 在链表头部插入节点 linked_list.insert_at_head(1) linked_list.insert_at_head(2) linked_list.insert_at_head(3) # 在链表尾部插入节点 linked_list.insert_at_tail(4) linked_list.insert_at_tail(5) # 在指定位置插入节点 linked_list.insert_at_position(6, 2) # 删除节点 linked_list.delete_node(3) # 查找节点 is_found = linked_list.find_node(4) print(is_found) # 获取链表长度 length = linked_list.get_length() print(length) # 遍历链表并输出元素 linked_list.traverse() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值