C语言——链式结构 [倒序] (数据结构)

链式结构-头部插入法-倒序

  • 构建单链表(头部插入法)
    头部插入法,就是每个新结点插入链表的头部,因此跟你输入的顺序相反。这两个函数分别是头部插入和尾部插入,你可以把主函数里的调用改为尾部插入法。

数据结构

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
} Node, *LinkList;
/*链表的初始化*/
LinkList init(){
LinkList p;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
return p;
}
/*求表长*/
int len(LinkList H){
int len=0;
LinkList p;
for(p=H->next; p; p=p->next) len++;
return len;
}
/*头部插入法*/
void f_insert(LinkList H,ElemType s){
LinkList p,q;
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
p->next=H->next;
H->next=p;
}
/*尾部插入法*/
LinkList r_insert(LinkList H,ElemType s){
LinkList p,q;
for(q=H; q->next; q=q->next);
p=(LinkList)malloc(sizeof(Node));
p->next=NULL;
p->data=s;
q->next=p;
return p;
}
/*删除p指向的结点*/
void dele(LinkList H,LinkList p){
LinkList q;
for(q=H; q->next!=p; q=q->next);
q->next=p->next;
free(p);
}
/*按值查找*/
LinkList search_val(LinkList H,ElemType s){
LinkList p;
for(p=H->next; p; p=p->next)
if(p->data==s)
return p;
return NULL;
}
/*按序号查找,序号从1开始*/
LinkList search_no(LinkList H,int pos){
LinkList p;
int i=1;
if(pos<=0 || pos>len(H))
{
printf("输入的序号不合法!\n");
return NULL;
}
for(p=H->next; i!=pos; p=p->next)i++;
return p;
}
/*输出所有链表值*/
void print_all(LinkList H)
{
LinkList p;
for(p=H->next; p; p=p->next)
printf("%d ",p->data);
printf("\n");
}
/*在单链表H的第pos个结点前插入值为e的结点,pos从1开始*/
int insert(LinkList H,int pos,ElemType e)
{
LinkList p,q;
if(pos>len(H) || pos<1)
{
printf("输入的位置不合法\n");
return 0;
}
else if(pos==1) f_insert(H,e);
else
{
p=search_no(H,pos-1);
q=(LinkList)malloc(sizeof(Node));
q->data=e;
q->next=p->next;
p->next=q;
}
return 1;
}
/*递增有序链表La,Lb合并为Lc*/
void merge(LinkList La,LinkList Lb,LinkList *Lc)
{
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
(*Lc)=pc=La;/*pc总是指向生成的单链表的最后一个结点*/
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next = pa; /*将pa连接到pc之后*/
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
/*La单链表还有结点时,剩余结点放在pc后,否则Lb剩余结点放在pc后*/
pc->next = pa? pa:pb;
}
void destroy(LinkList H)
{
LinkList p=H,q=p->next;
while(q)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
int main()
{
LinkList H,Ha,Hb,Hc,p;
int n,menu,i;
ElemType e;
H=init();/*初始化带头结点的单链表,头指针为H,*/
Ha=init();/*初始化带头结点的单链表,头指针为Hb,*/
Hb=init();/*初始化带头结点的单链表,头指针为Ha,*/
do/*菜单*/
{
printf("\n\n*******************单链表操作*******************\n");
printf("1.构建单链表(头部插入法)\n");
printf("2.输出单链表各值\n");
printf("3.输出单链表表长\n");
printf("4.向单链表插入结点\n");
printf("5.删除单链表某结点\n");
printf("6.按序号查找单链表结点\n");
printf("7.归并有序单链表\n");
printf("8.退出程序\n");
printf("输入菜单号码:\n");
scanf("%d",&menu);
switch(menu)
{
case 1:
destroy(H);
H=init();
printf("输入要插入结点个数:\n");
scanf("%d",&n);
printf("输入要插入的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++)
{
scanf("%d",&e);
f_insert(H,e);/*在链表H头部插入值e*/
}
printf("单链表创建成功!\n");
Sleep(500);
system("cls");
break;

case 2:
printf("链表各元素为:\n");
print_all(H);
system("pause");
system("cls");
break;

case 3:
printf("单链表表长为%d\n",len(H));
system("pause");
system("cls");
break;

case 4:
printf("输入插入的位置:\n");
scanf("%d",&n);
printf("输入插入的元素值:\n");
scanf("%d",&e);
if(insert(H,n,e))
{
printf("插入元素%d后各值为:\n",e);
print_all(H);
}
system("pause");
break;

case 5:
printf("输入要删除的元素值\n");
scanf("%d",&e);
if((p=search_val(H,e))!=NULL)
{
dele(H,p);
printf("删除元素%d后各值为:\n",e);
print_all(H);
}
else printf("元素%d不存在!\n",e);
system("pause");
break;

case 6:
printf("输入要查找的元素序号:\n");
scanf("%d",&n);
if((p=search_no(H,n))!=NULL)
printf("链表第%d个元素为:%d\n",n,p->data);
system("pause");
break;

case 7:
destroy(Ha);
destroy(Hb);
Ha=init();
Hb=init();
printf("输入有序单链表Ha结点个数:\n");
scanf("%d",&n);
printf("输入有序单链表Ha的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++){
scanf("%d",&e);
r_insert(Ha,e);/*在链表Ha尾部插入值e*/
}
printf("输入有序单链表Hb结点个数:\n");
scanf("%d",&n);
printf("输入有序单链表Hb的%d个结点值,各值用空格分隔:\n",n);
for(i=0; i<n; i++){
scanf("%d",&e);
r_insert(Hb,e);/*在链表Hb尾部插入值e*/
}
merge(Ha,Hb,&Hc);
printf("合并后的有序单链表各值为:\n");
print_all(Hc);
system("pause");
break;

case 8:
destroy(H);/*删除链表H*/
destroy(Ha);/*删除链表Ha*/
destroy(Hb);/*删除链表Hb*/
return 0;
default:
printf("输入的菜单号有误!\n");
system("pause");
break;
}
}

while(1);
return 0;}
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GodOuO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值