C循环链表详解

不会链表?先看:
C单链表操作
写出来了不会用?看:

约瑟夫环(c循环链表) 

#include <stdio.h>
#include <stdlib.h>


#define maxn 100    


typedef int DataType;    //将数据类型定义为DataType,方便修改,这样如果需要改成char只需要改这里就行了
typedef struct Node{
    DataType data;
    struct Node *next;
}Node;


Node *CreatList(DataType a[],int n){
    Node *first = (Node*)malloc(sizeof(Node));
    first->next = NULL;
    Node *r = NULL,*p = NULL;
    r = first;


    for(int i = 0;i < n;i++){
        p = (Node*)malloc(sizeof(Node));
        p->data = a[i];
        p->next = NULL;
        r->next = p;
        r = p;
    }
    p->next = first->next; //链表末端指向链表头
    //此处是单链表和循环链表的差别


    return first;


}




 //删除第x位的元素
void DeleteData(Node *first,int x){
    Node *p = first->next;
    Node *r;
    int cnt = 1;    //cnt统计结点数


    while(p->next != first->next && cnt < x -1){    //判断是否遍历完成,当P为链表尾的时候,P->next应指向第一个元素,即first-next;
        p = p->next;
    }

    //敲黑板划重点
    //比如说链表中有数据 1 2 3 4 5
    //要删除位置为3 (此时对应数据也是3)
    //则令P指向第2个位置时停下来(修改指针域使P(此时P指向2)->next==P->next->next  (p->next->next指向4)
    r = p->next;
    p->next = r->next;
    free(r); //释放删除位的空间,防止内存泄漏


    //如果要取得删除的数据
    //则在函数声明中添加参数DataType *ptr
    //并将要删除的数据赋值给×ptr后再free
}


//循环链表其他操作如果需要遍历,则类似此函数,设置一个标记flag即可
//具体函数可参考C单链表操作
//http://blog.csdn.net/bestsort/article/details/78688374
void PrintList(Node *first){
    int flag = 0;//设置标记,当链表遍历完成后停止
    Node *p = first->next;


    while(p != first ->next || !flag){
        printf("%d ",p->data);
        p = p->next;
        flag = 1;
    }
}






int main()
{
    Node* first = NULL;
    int n;
    int i,k = 2,x = 1;
    DataType Data[maxn];


    scanf("%d",&n);
    for(i = 0;i < n;i++)
    scanf("%d",&Data[i]);
    first = CreatList(Data,n);


    PrintList(first);


    DeleteData(first,k);
    printf("\nAfter Delete:\n");
    PrintList(first);


    return 0;
}

posted @ 2017-12-05 09:08  秃头大师  阅读(380)  评论(1编辑  收藏  举报