有头结点的单向链表

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/52966606

有头结点的链表处理起来比较方便,因为头结点的存在,每个节点都可以以同样的方式调用。

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

typedef struct link{
    char data;
    struct link * next;
}LinkList;

LinkList * setList();               //初始化链表
void setNull(LinkList * );          //置空链表
int getLength(LinkList * );         //求链表长度
LinkList * getData(LinkList * ,int );   //按序号取元素
LinkList * Local(LinkList * , char );   //按值查找
void insert(LinkList * , int , char );  //在第i个位置插入元素
void deleteData(LinkList * , int  );    //删除第i个元素元素
void show(LinkList * );             //输出所有元素

int main (){

    LinkList * head = setList();
    while (1)
    {
        printf("1. 插入元素\t2.删除元素\n");
        printf("3. 按值查找\t4.按序号取元素\n");
        printf("5. 输出所有元素\t6. 退出\n");
        fflush(stdin);
        int n ;
        LinkList * s;
        scanf("%d",&n);
        switch(n){

        case 1: 
            printf("\n输入位置和元素: ");
            int i ; 
            char ch ;
            fflush(stdin);
            scanf("%d",&i);
            fflush(stdin);
            scanf("%c",&ch);
            insert(head,i,ch);
            break;
        case 2:
            printf("\n输入位置: ");
            int j ;
            fflush (stdin);
            scanf("%d",&j);
            deleteData(head , j );
            break;
        case 3:
            char ch_ ;
            fflush (stdin);
            scanf("%c" , &ch_);
            if (Local(head,ch_) != NULL){
                printf("\n包含该元素\n");
            }else{
                printf("\n不包含该元素\n");
            }
            break;
        case 4:
            int k ;
            fflush(stdin);
            scanf("%d",&k);
            s = getData(head ,k);
            if ( s != NULL){
                printf("\n该元素为:   %c \n",s->data );
            }else{
                printf("\n不包含该元素\n");
            }
            break;
        case 5:
            show(head);
            break;
        case 6:
            exit(0);
        }
    }
    return 0;
}

LinkList * setList (){
    LinkList * head = (LinkList *)malloc(sizeof(LinkList));
    head ->next = NULL;
    return head ;
}

int getLength(LinkList * s ){
    int length = 0;
    LinkList * p = s->next;
    while (p != NULL){
        p = p->next ;
        length ++;
    }
    return length;
}

LinkList * getData(LinkList * s ,int i ){
    int j = 0;
    LinkList * p = s ;
    while (p != NULL && j < i){
        p = p->next ;       
        j++;
    }
    if (p == NULL){
        printf("\n没有找到该元素\n");
    }
    return p;
}

LinkList * Local(LinkList * s ,char ch ){
    LinkList * p = s->next ;
    while (p != NULL){
        if (p->data != ch){
            p = p->next ;
        }else{
            break;
        }
    }
    return p;
}

void insert (LinkList * s ,int i ,char ch ){
    int j = 0;
    LinkList * p = s;
    while (p != NULL && j < i-1){
        p = p->next ;
        j++;
    }
    if (p == NULL || i <=  0){
        printf("\n序号错误\n");
    }else{
        LinkList * temp = (LinkList *)malloc(sizeof(LinkList));
        temp ->data  = ch ;
        temp ->next  = p ->next ;
        p ->next = temp;
    }
}

void deleteData(LinkList * s , int i ){
    int j = 0 ;
    LinkList * p = s ;
    while(p != NULL && j < i-1){
        p = p->next ;
        j++;
    }
    LinkList * temp = p->next ;
    p ->next = temp ->next ;
    free(temp);
}
void show (LinkList * s){
    LinkList * p = s ->next ;
    printf("\n链表中的元素有: ");
    while(p != NULL){
        printf("%c ",p->data );
        p = p->next ;
    }
    putchar ('\n');
}
上一篇:关于IP地址


下一篇:带头结点的链表的逆置