华南农业大学数据结构oj 8580 合并链表

#include<stdio.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
#define ElemType int

typedef struct LNode
{
 int data;
 struct LNode *next;
}LNode,*LinkList;

int CreateLink_L(LinkList &L,int n){
// 创建含有n个元素的单链表
  LinkList p,q; // p为当前数据内容,q为下一个数据的地址
  //LinkList L只改变结构体的内容,不改变L的地址
  //而LinkList *L会改变L的地址
  int i;
  ElemType e;
  L = (LinkList)malloc(sizeof(LNode));//生成新结点作为头结点,即L为头结点
  //动态内存申请样例:p = (int *)malloc(sizeof(int));
  L->next = NULL;              // 给头结点下一个结点接上NULL,以NULL隔开,让头结点成为旧结点

  q = (LinkList)malloc(sizeof(LNode));//给予新结点q内存空间
  q = L;//新结点q变成旧结点(为下一个新结点的生成铺垫条件,即q结点为null后的结点)
  for (i=0; i<n; i++)
 { //生成n个元素的单链表
    scanf("%d", &e);
    p = (LinkList)malloc(sizeof(LNode));  // 给新节点p分配空间
    p -> data = e; //把e赋给结点p的数据域
    q -> next = p; //旧结点的指针指向新节点 把新旧结点链接起来
    p -> next = NULL; //新节点指向空,因为后面还没有元素加入
    q = p; //把新结点p变为旧结点q,为新的结点加入而做铺垫

  }
  return OK;
}

int ListInsert_L(LinkList &L, int i, ElemType e) {  // 算法2.9
LNode * newNode = (LinkList)malloc(sizeof(LNode)); //定义新节点newNode并赋予内存,LNode为定义新节点
newNode->data=e;//将e值放入newNode结点中
newNode->next=NULL;//给newNode接上一个为空的新结点
int num=0;//记录链表有多少个结点
LNode * p = L->next;//头节点的下一个结点位置定义为结点p
while(p!=NULL)//p非空时
{
	p=p->next;//指向p的下一个结点
	num++;//结点数+1
}
if(i>num+1)//当输入的第i个位置超出了链表长度时
{
	return ERROR;//返回ERROR值
}
p= L;//将p定位为头节点
int j=0;
while(j<i-1&&p!=NULL) //查找第i-1个结点,p指向该结点
{
	p=p->next;
	j++;
}
newNode->next=p->next;//将i-1结点的下一个位置(即i)赋给新结点的下一个位置
    p->next=newNode;//将新结点放入i-1结点的下一个位置(即i)
    return OK;
}

int ListDelete_L(LinkList &L, int i, ElemType &e) {  // 算法2.10
  // 在带头结点的单链线性表L中第i个位置之前插入元素e
// 请补全代码
LNode * newNode = (LinkList)malloc(sizeof(LNode)); //定义新节点newNode并赋予内存,LNode为定义新节点
newNode->data=e;//将e值放入newNode结点中
newNode->next=NULL;//给newNode接上一个为空的新结点
int num=0;//记录链表有多少个结点
LNode * p = L->next;//头节点的下一个结点位置定义为结点p
while(p!=NULL)//p非空时
{
	p=p->next;//指向p的下一个结点
	num++;//结点数+1
}
if(i>num+1)//当输入的第i个位置超出了链表长度时
{
	return ERROR;//返回ERROR值
}
p= L;//将p定位为头节点
int j=0;
while(j<i-1&&p!=NULL) //查找第i-1个结点,p指向该结点
{
	p=p->next;
	j++;
}
newNode->next=p->next;//将i-1结点的下一个位置(即i)赋给新结点的下一个位置
    p->next=newNode;//将新结点放入i-1结点的下一个位置(即i)
    return OK;
}

int LoadLink_L(LinkList &L)
{
// 单链表遍历并输出数据
 LinkList p = L->next;
 if(p==NULL)
 printf("The List is empty!");
 else
 {
	 while(p!=NULL)
	 {
		printf("%d ",p->data);
		p=p->next;//指针下移
	 }
 }
 printf("\n");
 return OK;
}

int MergeList_Sq(LinkList &A, LinkList &B, LinkList &C)
{
    LinkList pA = A->next;  //让pA指针指向A链表第一个有效节点(首节点,即头结点的下一个结点)
    LinkList pB = B->next;  //让pB指针指向B链表第一个有效节点(首节点, 即头结点的下一个结点)
    LinkList pC = C;        //让pC指针指向C链表的头结点
    while (pA != NULL && pB != NULL)//当pA指针与pB的指针的指向都非空时
    {
        if (pA->data > pB->data)//如果A链表的首结点大于B链表的首结点
        {
            pC->next = pB;  //让pB指针指向的B表中的对应结点接到C上
            pB = pB->next;  //指针后移动
            pC = pC->next;  //指针后移动
        }
        else//否则
        {
            pC->next = pA;   //让pA的指针指向的B表中的对应结点接到C上
            pA = pA->next;   //指针后移动
            pC = pC->next;   //指针后移动
        }
    }
    if (pA == NULL)//如果指针pA指向的链表A结点为空
    {
        while (pB != NULL)//当指针pB指向的链表B结点非空时
        {
            pC->next = pB;//让pB指针指向的对应B表中的对应结点接到C上
            pB = pB->next;//指针后移
            pC = pC->next;//指针后移
        }
    }
    else
    {
        while (pA != NULL)//当指针pA指向的链表B结点非空时
        {
            pC->next = pA;//让pB指针指向的对应B表中的对应结点接到C上
            pA = pA->next;//指针后移
            pC = pC->next;//指针后移
        }
    }
    return OK;  //别忘了
}

int main()
{
LinkList A;
LinkList B;
int a,n;
scanf("%d",&n);
CreateLink_L(A,n);
scanf("%d",&a);
CreateLink_L(B,a);
printf("List A:");
LoadLink_L(A);
printf("List B:");
LoadLink_L(B);
LinkList C = (LinkList)malloc(sizeof(LNode));
C->next = NULL; // 先建立一个带头结点的单链表
MergeList_Sq(A, B, C);
printf("List C:");
LoadLink_L(C);
}

以上我加过注释后的代码,望同学们易读好学,有改进之处可以提出来!有错误之处也望大神指出!

<think>好的,用户想找华南农业大学数据结构在线判题系统(OJ平台)的相关信息和资源,比如使用指南或题目列表。首先,我需要确认用户提到的具体内容是否在已有的引用中有相关信息。 查看引用[1]提到的是“oj 3-2 循环输入与数据精度”,引用[2]是关于华南农业大学OJ平台上的动态规划题目,引用[3]涉及组队列的应用。这些引用中,引用[1]和[2]直接提到了华农OJ平台,但并没有详细的使用指南或完整的题目列表。用户可能需要更全面的信息,比如如何注册、如何提交代码、题目分类等。 接下来,我需要考虑用户可能的实际需求。通常,学生使用OJ平台是为了练习编程和数据结构题目,所以除了基本的使用指南,可能还需要知道题目的难度分布、常见题型或如何找到题解。引用[2]中的题解示例可能对用户有帮助,但用户可能需要更系统化的资源。 另外,引用中没有提供具体的网址或登录方式,可能需要建议用户通过校内资源或联系相关部门获取最新信息。同时,考虑到OJ平台可能有不同的访问途径,比如校内网络才能访问,需要提醒用户注意这一点。 还需要生成相关问题,这些问题应该围绕用户的需求展开,比如如何访问平台、题目类型、常见错误等。确保问题对其他用户也有参考价值。 最后,整理回答时要结构清晰,分点说明,确保用户能一步步找到所需信息,并引用已有的参考资料适当标注,比如引用[1]和[2]中的例子。</think>### 华南农业大学数据结构 OJ 平台相关信息 根据提供的引用内容和常见信息,以下是关于华南农业大学数据结构在线判题系统(OJ 平台)的整理与分析: 1. **平台入口与访问方式** - 通常需通过校内网络或指定域名访问(如学校官网或计算机学院页面)。若引用[1]中提到的“oj 3-2”属于该平台,可能需通过课程页面登录。 - 建议联系授课教师或查阅课程公告获取最新链接[^1]。 2. **题目类型与特点** - 题目涵盖基础数据结构(如队列、栈、树)和算法(如动态规划、排序)。例如,引用[2]中的“最长公共子字符串”是一道动态规划题,强调时间复杂度优化[^2]。 - 部分题目可能涉及输入输出细节(如引用[1]提到的“循环输入与数据精度”),需注意边界条件。 3. **使用建议** - **代码提交规范**:需符合题目要求的输入输出格式,例如引用[1]中的题目可能对浮点数精度有特殊要求。 - **调试技巧**:对于动态规划等问题,可参考引用[2]的题解思路,利用表格法或状态转移方程简化逻辑[^2]。 - **组队列实现**:引用[3]提到的组队列可结合队列和哈希表实现,注意分组逻辑与命令解析[^3]。 4. **题目列表获取途径** - 课程配套资源:部分题目可能通过实验课或教材附录提供。 - 平台内分类检索:若平台支持按标签(如“字符串”“图论”)或难度筛选,可快速定位题目。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Algae_Tian's

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值