循环链表

来源:互联网 发布:微机原理接口编程题 编辑:程序博客网 时间:2024/06/06 18:16
/*循环链表*/#include<stdio.h>typedef struct node{    int data;                   /*数据域*/    struct node * next;         /*指针域*/}Node,*LinkList;LinkList CreateLinkList(int n)  /*建表*/{    LinkList h,p,q;    int i,x;    h=malloc(sizeof(Node));     /*生成头结点*/    p=h;    p->next=NULL;               /*初始化*/    for(i=1;i<=n;i++)    {        printf("Num %d:",i);        scanf("%d",&x);        q=malloc(sizeof(Node));/*生成新结点*/        q->data=x;        p->next=q;             /*链接到头结点*/        p=q;                   /*指向新的结点*/    }    q->next=h;                 /*尾结点指向头结点*/    return h;}void PrintLinkList(LinkList h)/*输出*/{    LinkList p;    p=h->next;    while(p->next!=h->next)   /*尾结点的下一结点不是头结点*/    {        printf("%d ",p->data);        p=p->next;    }}LinkList LocaleLinkList(LinkList h,int i)/*定位*/{    LinkList p;    p=h->next;    int j=0;    while(j<i && p->next!=h->next)    {        j++;        p=p->next;    }    if(i==j)        return p;          /*查找到第i个节点*/    else        return (NULL);}void InsertLinkList(LinkList h,int x,int i)/*插入*/{    LinkList p,q;    if(i==1)        p=h->next;    else        p=LocaleLinkList(h,i-1);    if(p==NULL)        printf("插入位置有误!\n");    else    {        q=malloc(sizeof(Node));        q->data=x;        q->next=p->next;  /*新结点的下一结点链入i结点下一结点*/        p->next=q;        /*i结点下一结点链入新结点*/    }}main(){    LinkList L;    int i,n,x;    printf("创建链表,输入结点个数:");    scanf("%d",&n);    L=CreateLinkList(n);    printf("输出链表:");    PrintLinkList(L);    printf("\n");    printf("输入一个结点和位置:");    scanf("%d%d",&x,&i);    InsertLinkList(L,x,i);    printf("输出链表:");    PrintLinkList(L);    printf("\n");}