你好,数据结构(C语言)中实现有序链表的插入,删除结点基本操作,及两个有序链表的归并代码

供稿:hz-xin.com     日期:2025-01-13
C语言程序题:两个有序单链表的合并 合并之后仍然有序。 如第一个链表13579 第二个链表

ListNode*ReNewCombineList(ListNode*p1,ListNode*p2)//合并两个链表,,生成第三个链表递归
{
ListNode*pNewList=NULL;
//ListNode*p3=NULL;
if(p1==NULL)
return p2;
if(p2==NULL)
return p1;
if(p1->data<p2->data)
{
pNewList=p1;
pNewList->next=ReNewCombineList(p1->next,p2);
}
else
{
pNewList=p2;
pNewList->next=ReNewCombineList(p1,p2->next);
}
return pNewList;
}

扩展资料:return
C++的关键字,它提供了终止函数执行的一种方式。当return语句提供了一个值时,这个值就成为函数的返回值.
说到return,有必要提及主函数的定义,下面是从网络上找到的资料,好好消化吧,对了解主函数中返回值的理解有很大的帮助.
很多人甚至市面上的一些书籍,都使用了void main(),其实这是错误的。C/C++中从来没有定义过void main()。
C++之父Bjarne Stroustrup在他的主页上的FAQ中明确地写着The definition void main(){/*...*/}is not and never has been C++,
nor has it even been C.(void main()从来就不存在于C++或者C)。下面我分别说一下C和C++标准中对main函数的定义。
1.C
在C89中,main()是可以接受的。Brian W.Kernighan和Dennis M.Ritchie的经典巨著The C programming Language 2e(《C程序设计语言第二版》)用的就是main()。不过在最新的C99标准中,只有以下两种定义方式是正确的:
int main(void)
int main(int argc,char*argv[])
(参考资料:ISO/IEC 9899:1999(E)Programming languages—C 5.1.2.2.1 Program startup)
当然,我们也可以做一点小小的改动。例如:char*argv[]可以写成char**argv;argv和argc可以改成别的变量名(如intval和charval),不过一定要符合变量的命名规则。
如果不需要从命令行中获取参数,请用int main(void);否则请用int main(int argc,char*argv[])。
main函数的返回值类型必须是int,这样返回值才能传递给程序的激活者(如操作系统)。
如果main函数的最后没有写return语句的话,C99规定编译器要自动在生成的目标文件中(如exe文件)加入return 0;,表示程序正常退出。不过,我还是建议你最好在main函数的最后加上return语句,虽然没有这个必要,但这是一个好的习惯。
注意,vc6不会在目标文件中加入return 0;,大概是因为vc6是98年的产品,所以才不支持这个特性。现在明白我为什么建议你最好加上return语句了吧!不过,gcc3.2(Linux下的C编译器)会在生成的目标文件中加入return 0;。

#include
struct node
{
int n;
struct node *next;
}

main()
{
struct node *head,*p,*q,*r;
int n,m,i=0;
head=(struct node*)malloc(sizeof(struct node));//申请头结点
q=(struct node*)malloc(sizeof(struct node));//申请最后一个节点
head->next=q;//先链接头尾
q->next=NULL;
p=q;
printf("请输入节点个数!
");
scanf("%d",&n);
printf("请输入节点值!
");
scanf("%d",&q->n);
//通过循环将结点链接起来
while(i<n-1)
{
q=(struct node*)malloc(sizeof(struct node));
scanf("%d",&q->n);
head->next=q; //链接在头结点后面
q->next=p;//指向前一个节点
p=q;
i++;
}
r=head->next;
while(r!=NULL)
{
printf("%d
",r->n);
r=r->next;
}
}

//歌唱比赛评分系统
//动态单向链表结构
//单文件版

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <malloc.h>

#define LEN sizeof(S_MESSAGE)
#define N 10

typedef struct songer //定义选手信息链表结构
{
long num; //选手编号
char name[20]; //选手姓名
float grades[N]; //选手成绩
double ave; //平均成绩
struct songer * next; //链表的结点,next是指针变量,指向结构体变量
}S_MESSAGE;

S_MESSAGE * head; //定义链表的头指针
S_MESSAGE * tail; //定义链表的尾指针
int n=0; // n为全局变量,用于统计结点的个数

void creat(); //建立单向动态链表。此函数带回一个指向链表头的指针,用于参赛选手的录入
void del(); //用于删除结点,用于参赛选手的删除
void search(); //参赛选手成绩的查询
void print(); //用于输出链表
void rank(); //按个人平均成绩从高到低的顺序进行排序
void update(); //参赛选手的修改
void menu(); //操作系统菜单界面
void menu_select(); //菜单选择界面
void browse(); //选手信息浏览
void save(); //选手信息保存
void quit(); //退出系统界面

/*------------------------------------ rank函数 -----------------------------------------*/

void rank()
{
S_MESSAGE *p1,*p2,*endpt,*p; // *endpt/*控制循环比较*/ *p/*临时指针变量*/
n=0;
p1=head;

if(head == NULL && tail == NULL)
{
printf("\n--------当前信息记录为空--------\n");
}
else
{
p1 = (S_MESSAGE *)malloc(LEN);
p1->next = head; /*注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址。*/
head = p1; /*让head指向p1节点,排序完成后,我们再把p1节点释放掉*/
for(endpt=NULL; endpt!=head; endpt=p) /*结合第6点理解*/
{
for(p=p1=head; p1->next->next!=endpt; p1=p1->next)
{
if(p1->next->ave < p1->next->next->ave) /*如果前面的节点键值比后面节点的键值小,则交换*/
{
p2 = p1->next->next; //1、排序后q节点指向p节点,在调整指向之前,我们要保存原p的指向节点地址,即:p2=p1->next->next
p1->next->next = p2->next; //2、顺着这一步一步往下推,排序后p1->next->next要指的是p2->next,所以p1->next->next=p2->next
p2->next = p1->next; //3、p2->next原是q发出来的指向,排序后q的指向要变为指向p的,而原来p1->next是指向p的,所以p2->next=p1->next
p1->next = p2; //4、p1->next原是指向p的,排序后图16中p1->next要指向q,原来p1->next->next(即p2)是指向q的,所以p1->next=p2
p = p1->next->next; //5、至此,完成了相邻两节点的顺序交换
}
}
}
p1 = head; /*把p1的信息去掉*/
head = head->next; /*让head指向排序后的第一个节点*/
free(p1); /*释放p1*/

printf("\n-----------选手成绩排名信息如下---------\n");
printf("--------|--------|--------|--------\n");
printf(" 编号 | 姓名 |平均成绩| 名次 \n");

p1=head;
while(p1 != NULL)
{
printf("--------|--------|--------|--------\n");
printf(" %-9d%-9s%-9.1lf%-5d\n",p1->num,p1->name,p1->ave,n+1);
n++;
p1=p1->next;
}
printf("--------|--------|--------|--------\n");
}
getchar();
}

/*------------------------------------ print函数 -----------------------------------------*/

void print()
{
S_MESSAGE * p1=(S_MESSAGE *)malloc(LEN);
int check=0,i;
long seeknum;
printf("\n请输入要查找的选手编号:");
scanf("%d",&seeknum);
if(head == NULL && tail == NULL )
{
printf("\n对不起,当前记录为空!\n");
}
else
{
p1=head;
printf("\n-----------你要找的选手的成绩如下---------\n");//在这里找到了要查找的选手成绩
printf("------|------|------|----|----|----|----|----|----|----|----|----|----|--------\n");
printf(" 编号 | 姓名 | 成绩 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |平均成绩\n");
printf("------|------|------|----|----|----|----|----|----|----|----|----|----|--------\n");
while(p1 != NULL)
{
if(p1->num == seeknum)
{
printf(" %-7d%-6s",p1->num,p1->name);
printf(" ");
for(i=0;i<N;i++)
{
printf(" %.1f ",p1->grades[i]);
}
printf(" %-6.2lf\n",p1->ave);
check=1;
getchar();
return;
}
else
{
p1=p1->next;
}
}
}
if(head != NULL && check == 0)
{
printf("\n对不起,你查看的选手成绩不存在!\n");
}
getchar();
}

/*----------------------------------- search函数 -----------------------------------------*/

void search()
{
int c;
printf("\n请选择查询内容:\n");
printf("1.选手详细成绩查询 2.选手排名查询\n请输入您的选择:");
scanf("%d",&c);
switch(c)
{
case 1:system("cls");print();break;
case 2:system("cls");rank();break;
}
}

/*------------------------------------ save函数 ------------------------------------------*/

void save()//将数据保存到文件
{
FILE *fp;
S_MESSAGE *p1;//=(S_MESSAGE *)malloc(LEN);
p1=head;
fp=fopen("参赛选手名单.txt","w");
fprintf(fp,"--------|--------\n");
fprintf(fp," 编号 | 姓名 \n");
while(p1 != NULL)
{
fprintf(fp,"--------|--------\n");
fprintf(fp," %-9d%-6s\n",p1->num,p1->name);
p1=p1->next;
}
fprintf(fp,"--------|--------\n");
fclose(fp);
printf("\n\t文件已将保存到\"参赛选手名单.txt\"");
}

/*----------------------------------- update函数 -----------------------------------------*/

void update()
{
S_MESSAGE *p1;//=(S_MESSAGE *)malloc(LEN);
int check=0; //用来进行判断,是否找到了要修改的信息
long updatenum;
printf("\n请输入要修改的选手编号:");
scanf("%d",&updatenum);//查找到要修改的选手
if(head == NULL && tail == NULL)
{
printf("\n--------当前信息记录为空--------\n");
}
else
{
p1=head;
while(p1 != NULL)
{
if(p1->num == updatenum)
{
printf("\n-----------你要修改的选手信息如下---------\n");
printf("--------|--------\n");
printf(" 编号 | 姓名 \n");
printf("--------|--------\n");
printf(" %-9d%-6s\n",p1->num,p1->name);
printf("--------|--------\n");
printf("\n-----------请重新写入此选手信息:---------\n");
check=1;//从新写入修改项目
printf("\n修改选手编号为:");
scanf("%d",&p1->num);
printf("\n修改选手姓名为:");
scanf("%s",p1->name);
return;
}
else
{
p1=p1->next;
}
}
}
if(head != NULL && check == 0)
{
printf("\n对不起,你要修改的选手信息不存在!\n");
}
getchar();
}

/*----------------------------------- browse函数 -----------------------------------------*/

void browse()
{
S_MESSAGE *p1;
if(head == NULL && tail == NULL)
{
printf("\n--------当前信息记录为空--------\n");
}
else
{
printf("\n-----------你要浏览的选手信息如下---------\n");
printf("--------|--------\n");
printf(" 编号 | 姓名 \n");
p1=head;
while(p1 != NULL)
{
printf("--------|--------\n");
printf(" %-9d%-6s\n",p1->num,p1->name);
p1=p1->next;
}
printf("--------|--------\n");
}
}

/*------------------------------------- del函数 ------------------------------------------*/

void del()
{
S_MESSAGE *node;//=(S_MESSAGE *)malloc(LEN);
S_MESSAGE *p1;

int check=0; //用来进行判断,是否找到了要删除的信息
long del_num;
printf("\n请输入要删除的选手的编号:");
scanf("%d",&del_num);

if(head == NULL && tail ==NULL)
{
printf("\n当前信息记录为空,删除失败!\n");
}
else
{
node=head;
p1=head;
while(node != NULL)
{
if(node->num == del_num)
{
printf("\n--------要删除的选手信息--------\n");
printf("--------|--------\n");
printf(" 编号 | 姓名 \n");
printf("--------|--------\n");
printf(" %-9d%-6s\n",node->num,node->name); //在这里找到了要删除的选手信息
printf("--------|--------\n");
check=1; //找到要删除的信息,赋为真
if(node == head && head->next == NULL) //是头结点,并且只有一个结点
{
head=NULL;
tail=head;
free(node);
printf("\n--------删除信息成功--------\n"); //删除唯一的节点
}
else if(node == head && head->next != NULL) //删除头节点
{
node=head;
head=head->next;
free(node);
printf("\n--------删除信息成功--------\n"); //头节点删除成功
n=n-1;
}
else if(node ->next != NULL) //删除中间节点
{
p1->next=node->next;
free(node);
printf("\n--------删除信息成功--------\n"); //中间节点删除成功
n=n-1;
}
else if(node->next == NULL) //删除尾节点
{
p1->next=NULL;
tail=p1;
free(node);
printf("\n--------删除信息成功--------\n"); //尾节点删除成功
n=n-1;
}
getchar();
return;
}
else
{
p1=node;
node=node->next;
}
}
}
if(head != NULL && check == 0)
{
printf("\n对不起,你要删除的选手信息不存在!\n");
}
getchar();
}

/*------------------------------------ creat函数 -----------------------------------------*/

void creat()
{
int i,j;
float t;
char c='y';

while(c == 'y' || c == 'Y')
{
S_MESSAGE *p1=(S_MESSAGE *)malloc(LEN);
printf("\n请输入要录入的选手信息:\n");
printf("\n选手编号:");
scanf("%d",&p1->num);

printf("\n选手姓名:");
scanf("%s",p1->name);
printf("\n请输入10位评委点评成绩:");

p1->ave = 0;
for(i=0;i<N;i++)
{
scanf("%f",&(p1->grades[i])); //runtime error
p1->ave += p1->grades[i];
}

for(i=0;i<N-1;i++) //冒泡排序法让那个成绩从小到大排列,然后选出最大值是最后一个,最小值是第一个
for(j=0;j<N-1-i;j++)
if(p1->grades[j]>p1->grades[j+1])
{
t=p1->grades[j];
p1->grades[j]=p1->grades[j+1];
p1->grades[j+1]=t;
}
p1->ave=(p1->ave-(p1->grades[0]+p1->grades[9]))/8;//去掉一个最高分,去掉一个这一低分,得出最后的平均分

p1->next=NULL;

if(p1==NULL)
{
printf("\n内存分配失败\n");
n=n-1;
}

if(head == NULL && tail == NULL) //当前没有结点,创建第一个结点
{
head=p1;
head->next=NULL;
tail=head;
printf("\n------选手信息录入成功------\n");
}
else //如果当前还有节点则插入到尾部
{
tail->next=p1;
tail=p1;
tail->next=NULL;
printf("\n------选手信息录入成功------\n");
}
printf("是否继续(Y/N):");
getchar();
scanf("%c",&c);
}
}

/*------------------------------------- quit函数 -----------------------------------------*/

void quit()
{
printf("\n\n\t==========》感谢您使用歌唱比赛评分系统《==========\n\n");
}

/*------------------------------------- menu函数 -----------------------------------------*/

void menu()
{
printf("\n\n\t*************** 歌唱比赛评分系统 ***************\n\n");
printf("\t1.选手信息浏览 2.选手信息录入\n");
printf("\t3.选手信息保存 4.选手成绩查询\n");
printf("\t5.选手信息修改 6.选手信息删除\n");
printf("\t 7.退出系统\n");
printf("\n\t*************** 系统菜单选择界面 ***************\n");
printf("\t>> 请根据您想执行的命令,输入对应功能的数字键 <<\n");
printf("请输入您的选择:");
}

/*--------------------------------- menu_select函数 --------------------------------------*/

void menu_select()
{
char s[100];
int c;
gets(s); //不管用户输入的是数字键或是字母键使用gets都能将输入作为字符串接收

while(1) //限定用户输入的数值必须在1-7之间才有效,否则要求重新输入
{
c = atoi(s); //利用atoi()函数将所接收的字符串转换成数值,提供给if语句判断
if(c < 1 || c >7)
{
printf("您的输入有误,请重新输入:");
gets(s);
}
else break;
}

switch(c)
{
case 1:
system("cls"); //清屏
browse();
break;
case 2:
system("cls");
creat();
break;
case 3:
system("cls");
save();
break;
case 4:
system("cls");
search();
break;
case 5:
system("cls");
update();
break;
case 6:
system("cls");
del();
break;
case 7:
system("cls");
quit();
return;
break;
default:
break;
}
getchar();
system("cls");
menu();
menu_select();
}

/*------------------------------------- main函数 -----------------------------------------*/

int main()
{
menu();
menu_select();
return 0;
}
这是我以前写过的一个程序,里面包含了单向链表的各种操作,你可以看一看。至于你说的归并,实在不好意思,还没有学数据结构,那个帮不了你。悬赏我也不要,没有解决问题。

急需数据结构算法C语言版:假设有两个元素递增的有序排列线性表A和B...
char c;int flag=1;while(flag){ c=getchar();if(c!='$'){ s=(Node *)malloc(sizeof(Node));s->data=c;s->next=L->next;L->next=s;} else flag=0;} } void CreatFromTail(LinkList L){Node *r,*s;int flag=1;char c;r=L;while(flag){ c=getchar();if(c!='$')...

数据结构(C语言版) 图的遍历和拓扑排序
数据结构(C语言版) 图的遍历和拓扑排序 任务:给定一个有向图,实现图的深度优先,广度优先遍历算法,拓扑有序序列,并输出相关结果。功能要求:输入图的基本信息,并建立图存储结构(有相应提示),输出遍历序列,然后进行拓... 任务:给定一个有向图,实现图的深度优先, 广度优先遍历算法,拓扑有序序列,并输出相关结果。

c语言数据结构。假定对有序表(1,9,15,21,24,35,52,54,61,65,97)进行...
这个树是一棵二叉排序树,然后满足两个条件:如果查找表中的某元素需要进行n次比较,那么这个元素在二叉树的第n层;找到某元素的过程,就是走了一条从根结点到该元素所在结点的路径,所以只需要一步一步地算mid,来算出一个结点的左右子结点即可(当然可能只有一个子结点)。举个例子:首先令low=1...

C语言:生成20个随机数,然后把它们排序,最后要把排序前和排序后的数都...
num[i]=nums[i]; \/*备份原始数据*\/ } \/*选择法,从小到大排序*\/ for (i=1;i<=20;i++){ index=i; \/*从i到20这几个元素中最小值的序号*\/ for (j=i+1;j<=20;j++)if (nums[index]>nums[j])index=j;if (index!=i)\/*交换i和index的元素的值*\/ { temp=nums[index]...

(C语言,数据结构)判别一个数是否在序列中,在,就删除,不在,输出NO_百度...
include<iostream>using namespace std;struct node{ int date; node *next;};typedef node *link;int main(){ int n; int num_[8] = {1,2,3,4,5,6,7,8}; \/\/建立链表 link p,q; link head = new node; head->date = num_[0]; head->next = NULL; p = head; for(int ...

数据结构(c语言)中快速排序什么时候排序最慢,什么情况下使用快速排序...
不管是升序还是降序),此时快速排序最慢,一般当数据量很大的时候,用快速排序比较好,为了避免原来的序列有序,一般采用改进的快速排序算法,在排序之前随机交换两个元素的位置,就可以达到目的了,有一本书,叫《算法设计、分析与实现:C、C++和java》徐子珊著。可以看看,里面写了很多基本的算法 ...

数据结构用C语言编程序:26个英文字母的顺序表实现
include<stdio.h> main(){ int n=65;while(n<91){ putchar(n);n++;printf("\\n");} }

严蔚敏 的 《数据结构(C语言版)》 这本书在豆瓣评分为什么不高?_百度...
为什么严蔚敏的《数据结构(C语言版)》在豆瓣评分不高?在探讨这个问题之前,我们先来看看一些普遍观点。@thinKnight 提到的书籍中,《大话数据结构》和《算法》对于初学者来说更为友好,但《数据结构与算法分析》和《算法导论》则对入门者不太适合,需要具备一定的基础知识。有人批评严蔚敏的《数据结构》...

C语言冒泡排序法
冒泡排序每一趟排序把最大的放在最右边。比如:87 12 56 45 78 87和12交换:12 87 56 45 78 87和56交换: 56 87 45 78 87和45交换: 45 87 78 87和78交换: 78 87 到此第一趟排序结束,接下来的每一趟排序都是这样。include<stdio.h>void Print(int *num, int n){ int...

快速排序算法c语言
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。希尔排序算法 希尔排序,...