数据结构线性表c

数据结构实验之链表六:有序链表的建立

Time Limit: 1000MS Memory limit: 65536K

题目描述

输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表。

输入

第一行输入整数个数N;
第二行输入N个无序的整数。

输出

依次输出有序链表的结点值。

示例输入

6
33 6 22 9 44 5

示例输出

5 6 9 22 33 44
代码
#include <iostream>
using namespace std;
struct node
{
 int date;
 struct node *next;
};
int main()
{
 int i,n,t;
 struct node *head=NULL,*p=NULL,*q=NULL;
 cin>>n;
 head=new node;
 head->next=NULL;
 q=head;
 for(i=1;i<=n;i++)
 {
  p=new node;
  cin>>p->date;
        p->next=NULL;
  q->next=p;
  q=p;
 }
 q->next=NULL;
 q=head->next;
 while(q)
 {
  p=q;
  while(p)
  {
   if(p->date<q->date)
   {
    t=p->date;p->date=q->date;q->date=t;
   }
   else p=p->next;
  }
  q=q->next;
 }
 q=head->next;
 while(q)
    {
        cout<<q->date;
        if(q->next!=NULL)
            cout<<" ";
  else cout<<endl;
        q = q->next;
    }
    return 0;


}
### C语言实现线性表数据结构 #### 顺序表的定义与初始化 顺序表是一种基于数组的数据结构,其中元素按逻辑顺序存放在一块连续的内存空间内。为了创建一个顺序表,在C语言中通常会定义一个结构体来表示该表,并通过`malloc()`函数动态分配所需的存储空间。 ```c #define MAXSIZE 100 /* 定义最大长度 */ typedef struct { int data[MAXSIZE]; /* 存储元素的数组 */ int length; /* 当前实际长度 */ } SqList; ``` 当需要初始化一个顺序表时,可以通过如下方式设置其初始状态: ```c void InitList(SqList *L) { L->length = 0; /* 初始为空表 */ } ``` 这段代码展示了如何声明并初始化一个名为`SqList`类型的顺序表实例[^3]。 #### 插入操作 向顺序表中插入新元素涉及到调整现有元素的位置以腾出位置给新的成员。下面是一个用于在线性表指定位置处插入元素的方法示例: ```c bool ListInsert(SqList *L, int i, int e){ int k; if (i<1 || i>L->length+1) return false; if(L->length >= MAXSIZE) return false; for(k=L->length-1;k>=i-1;k--) L->data[k+1]=L->data[k]; L->data[i-1]=e; ++(L->length); return true; } ``` 此函数接受三个参数:指向顺序表对象的指针、待插入项的目标索引以及要添加的新值。它首先验证输入的有效性,接着移动必要的元素以为新条目留出空间,最后更新列表大小属性。 #### 删除操作 删除顺序表中的某个特定位置上的元素同样需要重新排列后续的所有项目。这里给出了一种简单的移除算法实现: ```c bool DeleteElem(SqList *L,int index){ if(index < 1 || index > L->length ) return false; --(L->length); while(++index<=L->length){ L->data[index-1]=L->data[index]; } return true; } ``` 上述过程先减少了表长计数器,再循环覆盖掉被删去节点之后的所有记录直到达到最新的末端边界。 #### 链式存储结构简介 除了顺序表之外,另一种常见的线性表形式是链式存储结构。这类结构由一系列结点组成,每个结点都含有两个部分——保存具体数值的部分和链接下一个相邻结点地址的指针字段。对于单项链表而言,则只需要维护头尾两端即可支持基本功能的操作[^2]。 ```c // 单链表节点定义 typedef struct Node{ int value; struct Node* next; }*LinkNode; // 创建一个新的节点 LinkNode CreateNewNode(int val){ LinkNode newNode=(LinkNode)calloc(sizeof(struct Node),1); newNode->value=val; newNode->next=NULL; return newNode; } // 向链表头部添加元素 void AddToHead(LinkNode* headRef, int newValue){ LinkNode temp=*headRef; (*headRef)=CreateNewNode(newValue); (*headRef)->next=temp; } ``` 这些片段说明了怎样构建起始于零个或多个已知整型值得到一条完整的单向连接路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值