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

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

  • 通过输入结点个数n后,输入要插入的n个结点值,各值用空格分隔,即可创建单链表。

数据结构

#include <stdio.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,p;
    int n,i;
    ElemType e;

    H=init();/*初始化带头结点的单链表,头指针为H,*/

    printf("构建单链表(尾部插入法)\n");
    printf("输入要插入结点个数:\n");
    scanf("%d",&n);

    printf("输入要插入的%d个结点值,各值用空格分隔:\n",n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&e);
        r_insert(H,e);/*这里改变一下,把原先的f_insert改为r_insert,就能在链表H尾部插入值e*/
    }
    printf("单链表创建成功!\n");

    printf("\n链表各元素为:\n");
    print_all(H);

    printf("\n单链表表长为%d\n",len(H));

    printf("\n向单链表插入结点\n");
    printf("输入插入的位置:\n");
    scanf("%d",&n);
    printf("输入插入的元素值:\n");
    scanf("%d",&e);
    if(insert(H,n,e))
    {
        printf("插入元素%d后各值为:\n",e);
        print_all(H);
    }

    printf("\n删除单链表某结点\n");
    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);

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

    destroy(H);/*删除链表H*/

    return 0;}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

GodOuO

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

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

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

打赏作者

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

抵扣说明:

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

余额充值