C语言实现单向链表、双向链表、循环链表

13 篇文章 2 订阅

1. 单向链表

/*创建单向链表*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

struct LNode{
    int data;
    struct LNode * next;
};

//该函数创建一个单向链表
struct LNode * create(int n){
    int i;
    struct LNode * head,*p1,*p2;  //head头指针,p1为新建指针,p2指向链表末尾
    int a;
    head=NULL;
    printf("输入整数:\n");
    for(i=n;i>0;--i){
        p1=(struct LNode *)malloc(sizeof(struct LNode));
        scanf("%d",&a);
        p1->data=a;
        if(head==NULL){
            head=p1;
            p2=p1;
        }else{
            p2->next=p1;
            p2=p1;
        }
    }
    p2->next=NULL;
    return head;
};

int main()
{
    int n;
    struct LNode * q;
    printf("输入你想创建的节点个数:\n");
    scanf("%d",&n);
    q=create(n);
    printf("结果是:\n");
    while(q){  //输出链表
        printf("%d ",q->data);
        q=q->next;
    }
    return 0;
}


2. 创建双向链表

/*创建双向链表*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef struct node{
    char name[20];
    struct node * prior,*next;
}stud;  //双向链表的结构定义

//创建一个双向链表
stud * creat(int n){
    stud * p,*h,*s;  //p指向尾节点,h指向头节点,s为新建节点
    int i;
    h=(stud *)malloc(sizeof(stud));
    h->name[0]='\0';
    h->prior=NULL;
    h->next=NULL;
    p=h;
    for(i=0;i<n;++i){
        s=(stud *)malloc(sizeof(stud));
        p->next=s;
        printf("输入第%d个学生的姓名:",i+1);
        scanf("%s",s->name);
        s->prior=p;
        s->next=NULL;
        p=s;
    }
    p->next=NULL;
    return h;
}

//该函数实现查找要删除的节点
stud * search(stud *h,char *x){
    stud *p;
    char *y;
    p=h->next;
    while(p){
        y=p->name;
        if(strcmp(y,x)==0)  //判断字符串y是否和要查找的字符串x一致
            return p;
        else
            p=p->next;
    }
    printf("没有找到数据!\n");
}


//删除链表中指定的节点
void del(stud *p){
    p->next->prior=p->prior;
    p->prior->next=p->next;
    free(p);
}

int main()
{
    int number;
    char sname[20];
    stud * head,*sp;
    puts("请输入链表的大小:");
    scanf("%d",&number);
    head=creat(number);
    sp=head->next;
    printf("\n现在这个双链表是:\n");
    while(sp){
        printf("%s ",&*(sp->name));
        sp=sp->next;
    }
    printf("\n\n请输入你想查找的姓名:\n");
    scanf("%s",sname);
    sp=search(head,sname);
    printf("你想查找的姓名是:%s\n",*&sp->name);
    del(sp);
    sp=head->next;
    printf("\n现在这个双链表是:\n");
    while(sp){
        printf("%s ",&*(sp->name));
        sp=sp->next;
    }
    return 0;
}

3. 创建循环链表

/*创建循环链表*/
#include <stdio.h>
#include <stdlib.h>

//声明struct student类型
typedef struct student{
    int num;
    struct student * next;
}LNode,*LinkList;

//自定义函数create(),实现创建一个循环链表
LinkList create(void){
    LinkList head;  //head指向头
    LNode *p1,*p2;  //p1指向新建节点,p2指向尾节点
    char a;
    head=NULL;
    a=getchar();
    while(a!='\n'){
        p1=(LNode *)malloc(sizeof(LNode));
        p1->num=a;
        if(head==NULL){
            head=p1;
        }else{
            p2->next=p1;
        }
        p2=p1;
        a=getchar();
    }
    p2->next=head;  //尾节点指向头节点
    return head;
}


int main()
{
    LinkList L1,head;
    printf("请输入循环链表 \n");
    L1=create();
    head=L1;
    printf("这个合成的链表是:\n");
    printf("%c",L1->num);
    L1=L1->next;
    while(L1!=head){  //循环到头节点结束
        printf("%c",L1->num);
        L1=L1->next;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值