链表及其基本操作的实现(C语言)

基于严蔚敏版的《数据结构(C语言版)》实现单链表及其基本操作。

1、头文件和结构体:

#include <stdlib.h>  
#include <stdio.h>
#include <windows.h>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;

2、函数声明:

int createList(LinkList *L, int n);
int getElem(LinkList L, int i); 
int print_List(LinkList head);
int listInsert(LinkList L, int i, ElemType e);
int listDelete(LinkList L, int i);
LinkList mergeList(LinkList La, LinkList Lb);

需要注意的是,如果主函数main在其他函数之后就不需要函数声明,编译时也不会有警告;反之,需要声明函数,否则会出现编译警告。我这里把主函数放在最后面。

3、创建一个带头结点的单链表

int createList(LinkList *L, int n){//创建一个带头结点的链表 
    LinkList newLNode, head, temp;
    int i;
    ElemType data;
    head = (LinkList) malloc (sizeof(LNode));
    temp = head;
    for(i=0; i<n; i++){
        newLNode = (LinkList) malloc (sizeof(LNode));//生成新节点
        printf("输入第%d个元素的值:",i+1);
        scanf("%d", &data);
        newLNode->data = data;
        temp->next = newLNode;
        temp = newLNode;
    }
    newLNode->next = NULL;
    *L = head;
    return 0;
}//createList

4、打印单链表

int print_List(LinkList head) {//打印 
    printf("当前链表:");
    LinkList temp;
    if(head == NULL || head->next == NULL) {
        printf("空表\n");
    }
    temp = head;
    while(temp->next) {
        printf("%d ", temp->next->data);
        temp = temp->next;
    }
    printf("\n");
    printf("\n");
    printf("\n");
    return 0;
}

5、按位获取单链表的元素

int getElem(LinkList L, int i){//按位获取,返回第i个元素的值 
    LinkList temp;
    temp = L;
    for(int j = 1; j<=i; j++){
        temp = temp->next;
    }
    return temp->data;
}

6、按位插入元素

int listInsert(LinkList L, int i, ElemType e){//按位插入元素
    LinkList p = L;
    int j = 0;
    while(p && j<i-1) {
        p = p->next;
        ++j; 
    }
    if(!p || j>i-1) return -1;
    LinkList s = (LinkList) malloc (sizeof(LNode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return 0;
} 

7、按位删除,返回被删除的元素

int listDelete(LinkList L, int i){//按位删除,返回被删除的元素的值
    LinkList p, q;
    p = L;
    int j = 0;
    while(p->next && j<i-1) {
        p = p->next;
        ++j;
    }
    if(!(p->next) || j>i-1) return -1;
    q = p->next;
    p->next = q->next;
    ElemType e = q->data;
    free(q);
    return e;
}

8、非递减的线性表合并,前提是输入的两个单链表是非递减的(因为这里没实现单链表排序)。

LinkList mergeList(LinkList La, LinkList Lb) {//非递减表合并
    LinkList pa, pb, pc;
    pa = La->next;
    pb = Lb->next;
    LNode newNode;
    LinkList Lc;//新链表的头结点
    Lc = &newNode;
    pc = Lc;//新链表的当前结点
    pc->next = NULL;
    while(pa && pb) {
        if(pa->data <= pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    pc->next = pa ? pa : pb;
    free(Lb);
    print_List(Lc);
    return Lc;
}

9、主函数

int main(){
    printf("创建链表,请输入链表长度:");
    int length;
    scanf("%d", &length);
    LinkList L;
    createList(&L, length);
    print_List(L);
    
    printf("需要获取第几个元素?");
    int elemIndex;
    scanf("%d", &elemIndex);     
    int get_e = getElem(L, elemIndex);
    printf("第%d个元素的值为 %d\n", elemIndex, get_e);
    print_List(L);
    
    printf("插入的位置:");
    int inserIndex;
    scanf("%d", &inserIndex);
    printf("插入的数据:");
    int inserData;
    scanf("%d", &inserData);
    listInsert(L, inserIndex, inserData);
    print_List(L); 
    
    printf("删除第几个元素?");
    int deleIndex;
    scanf("%d", &deleIndex); 
    ElemType dele_e = listDelete(L, deleIndex); 
    printf("已删除元素:%d\n", dele_e);
    print_List(L);
    printf("--------非递减链表的合并--------\n\n\n");  
    LinkList La, Lb;
    int len1=4,len2=3;
    printf("输入第一个非递减链表(长度为4):\n");
    createList(&La, len1);
    print_List(La);
    printf("输入第二个非递减链表(长度为3):\n");
    createList(&Lb, len2);
    print_List(Lb); 
    printf("合并后的链表:");
    mergeList(La, Lb);
    system("pause");
    return 0;
}

最后,运行结果:

                           ——————完——————



猜你喜欢

转载自www.cnblogs.com/lu-cheng/p/11782805.html