チェーンストレージ(単一リンクリスト)は、線形テーブルの検索、挿入、削除、結合、および削除を実現します。

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OVERFLOW -1
#define OK 1
typedef int ElemType;
typedef int Status;

typedef struct Node{
    
    
	ElemType data;
	struct Node* next;
}LNode,*LinkList;

//头插法创建单链表
Status CreateListHead_L(LinkList *List,int n){
    
    
    (*List)=(LinkList)malloc(sizeof(LNode));
    if(!(*List)){
    
    
        return OVERFLOW;
    }
    (*List)->next=NULL;
    LinkList p;
    for(int i=0;i<n;i++){
    
    
        p=(LinkList)malloc(sizeof(LNode));
        p->data=i;
        p->next=(*List)->next;
        (*List)->next=p;
    }
    return OK;
}

//尾插法建立单链表
Status CreateListTail_L(LinkList *List,int n){
    
    
    (*List)=(LinkList)malloc(sizeof(LNode));
    if(!(*List)){
    
    
        exit(OVERFLOW);
    }
    (*List)->next=NULL;
    LinkList p,tail;
    tail=(*List);
    for(int i=0;i<n;i++){
    
    
        p=(LinkList)malloc(sizeof(LNode));
        p->data=i;
        p->next=tail->next;
        tail->next=p;
        tail=p;
    }
    return OK;
}

//获得链表第i个元素
//算法思路:
/*
    1. 声明一个节点p指向第一个节点,用于遍历链表
    2. 定义一个计时器j从1开始,j<i时,遍历链表,j++
    3. 查找成功:p!=NULL&&j=i
    4. 查找失败:p==NULL||j>i
 */
Status GetElem(LinkList List,int i,ElemType *e){
    
    
    int j=1;    //j为计数器
    LinkList p;
    p=List->next;   //p指向链表第1个节点
    while (p&&j<i) {
    
    
        p=p->next;
        j++;
    }
    if(!p||j>i){
    
    
        return ERROR;
    }
    *e=p->data;
    return OK;
}

//向单链表中插入一个元素
Status InsertList_L(LinkList *List,ElemType e,int i){
    
    
    LinkList p;
    p=*List;
    int j=0;
    while (p&&j<i-1) {
    
    
        p=p->next;
        j++;
    }
    if(!p||j>i-1){
    
    
        printf("插入位置有错\n");
        return ERROR;
        //插入位置有错
    }
    LinkList s;
    s=(LinkList)malloc(sizeof(LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}

//删除元素
Status DeleteList_L(LinkList *List,int i,ElemType *e){
    
    
    LinkList p;
    p=(*List);
    int j=0;
    while (p->next&&j<i-1) {
    
    
        p=p->next;
        j++;
    }
    if(!(p->next)||j>i-1){
    
    
        printf("出错了");
        return ERROR;
    }
    LinkList q;
    q=p->next;
    *e=q->data;
    p->next=q->next;
    free(q);
    return OK;
}

LinkList Search(LinkList List,ElemType e){
    
    
    LinkList p;
    p=List->next;
    while (p) {
    
    
        if(p->data==e){
    
    
            break;
        }
        p=p->next;
    }
    return p;
}

//求并集
void MergeList(LinkList La,LinkList Lb,LinkList *Lc){
    
    
    LinkList pa=La->next;
    LinkList pb=Lb->next;
    LinkList pc;
    (*Lc)=pc=La;
    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);
}

//整表删除
Status ClearList(LinkList *List){
    
    
	LinkList p,q;
	p=(*List)->next;
	while(p){
    
    
		q=p->next;
		free(p);
		p=q;
	}
	(*List)->next=NULL;
	return OK;
}

//打印链表元素
void PrintList(LinkList List){
    
    
    LinkList p;
    p=List->next;
    while (p) {
    
    
        printf("%d\n",p->data);
        p=p->next;
    }
}

int main() {
    
    
    LinkList List;
    CreateListHead_L(&List, 8);
    int temp;
    GetElem(List, 3, &temp);
    printf("%d\n",temp);
    InsertList_L(&List, 10, 9);
    PrintList(List);
    int e;
    DeleteList_L(&List, 9, &e);
    PrintList(List);
    LinkList La,Lb,Lc;
    CreateListTail_L(&La, 8);
    CreateListTail_L(&Lb, 8);
    MergeList(La, Lb, &Lc);
    PrintList(Lc);
    return 0;
}

ここのユニオンセットでは、元の2つのセットの要素を小さいものから大きいものに配置する必要があります

おすすめ

転載: blog.csdn.net/qq_45465526/article/details/103830587