C单链表操作

来源:互联网 发布:网络拓扑结构 编辑:程序博客网 时间:2024/06/05 00:51

函数顺序依次为单链表的创建(头插和尾插法),初始化,判空,遍历,求链表长度,按值查找,按位查找,插入,删除,销毁操作

并且在主函数中举例说了链表的创建,遍历,求长,删除,插入操作;




#include <stdio.h>

#include <stdlib.h>


typedef int DataType;          //用DataType 替代 int方便修改数据类型
typedef struct Node{
    DataType data;           //数据域
    struct Node *next;      //指针域
}Node;


//建立单链表(尾插法)
//比如说数据1 2 3 4 5
//链表中从头指针开始数据顺序为1 2 3 4 5
//每次从链表末尾插入
Node *CreatTailList(DataType a[],int n){
    Node *s = NULL,*r = NULL;
    Node *first = (Node *)malloc( sizeof(Node));
    r = first;//尾指针初始化
    first -> next = NULL;
    int i = 0;
    for(i;i < n;i++){
        s = (Node*)malloc(sizeof(Node));
        s -> data = a[i];
        r-> next = s;
        r = s;               //将结点S插入到终端结点之后
    }
    r -> next = NULL;       //终端结点指针指向NULL
    return first;
}


//建立单链表(头插法)
//比如说数据1 2 3 4 5
//链表中从头指针开始数据顺序为5 4 3 2 1
//每次从链表头部插入
Node *CreatHeadList(DataType a[],int n){
    Node *s = NULL;
    Node *first = (Node*)malloc(sizeof(Node));
    first -> next= NULL;
    int i = 0;
    for(i;i < n;i++){
        s = (Node*)malloc(sizeof(Node));
        s -> data = a[i];
        s -> next = first -> next;
        first-> next = s;
    }
    return first;


}
//链表初始化
Node *InitList(){
    Node *first = (Node *)malloc(sizeof(Node));
    first->next = NULL;
    return first;
}






//判断空是否为空链表
int Empty(Node *first){
    if(first->next == NULL)
        return 1;
    return 0;
}


//遍历
void PrintList(Node*first){
    Node*p = first -> next;
    while(p != NULL){
        printf("%d ",p->data);
        p = p->next;
    }
}


//求链表长度
int Length(Node*first){
    Node *p = first->next;
    int cnt = 0;
    while(p != NULL){
        cnt++;
        p = p -> next;
    }
    return cnt;
}


//按值查找,查找失败返回0,成功返回数据所在位置
int Locale(Node *first,int x){
    Node *p = first->next;
    int cnt = 1;
    while(p != NULL){
        p = p -> next;
        cnt ++;
        if( p -> data == x)
            return cnt;
    }
    return 0;
}




//按位查找,失败返回0,成功返回指向第x个数据的指针ptr
int Get(Node *first,int x,DataType *ptr){
    Node *p = first->next;
    int cnt = 1;
    while(p != NULL || cnt < x){
        p  = p -> next;
        cnt ++;
    }
    if(p == NULL)
        return 0;
    *ptr = p->data;
    return 1;
}




//插入
int Insert(Node *first,int x,DataType t){ //x 为插入位置,t为要插入的数据
    Node *s = NULL,*p = first;
    int cnt = 0;
    while ( p != NULL && cnt < x - 1){
        p = p -> next;
        cnt ++;
    }
    if(p == NULL ){
        return 0; // 插入位置错误返回0
    }
    s = (Node*)malloc(sizeof(Node));//请求分配空间 .
    s -> data = t;                  //申请一个结点,数据域为x
    s -> next = p -> next;          //将结点S插入到结点P之后
    p -> next = s;
    return 1;
}


//删除某一位置的结点
int Delete(Node *first,int i,DataType *ptr){ //i为要删除的数据,ptr取得删除的值
    Node *p = first,*q = NULL;
    int cnt = 0;
    DataType x;
    while(p != NULL && cnt < i - 1){
        p = p -> next;
        cnt++;
    }
    if(p == NULL || p-> next == NULL){
        return 0;                  //删除失败
    }
    q = p -> next;
    *ptr = q -> data;               //删除失败的值
    p -> next = q -> next;
    free(q);
    return 1;
}


//销毁
void DestroyList(Node *first){
    Node *p = first;
    while (first != NULL){          //依次释放储存空间
        first = first -> next;
        free(p);
        p = first;
    }
}




int main()
{
    Node *first;
    DataType data[] = {1,2,3,4,5};
    int x,n;


    n = sizeof(data)/sizeof(data[0]);//求出数组data中元素个数


    first = CreatTailList(data,n);//尾插


    printf("After Creat,the data is:  ");
    PrintList(first);
    printf("\n");


    if(Delete(first,3,&x)){
        printf("After Delete,the data is:  ");
        PrintList(first);
        printf("   Delete %d",x);
        printf("\n");
    }
    else
        printf("Delete Defult\n");


    if(Insert(first,2,7)){
        printf("After Insert,the data is:  ");
        PrintList(first);
        printf("\n");
    }
    else
        printf("Insert Defult\n");


    printf("the List Length is: %d",Length(first));


    return 0;
}
原创粉丝点击