c语言实现顺序表基本操作是什么,用c语言实现顺序表的各种基本运算

发布时间:2023-01-08

本文目录一览:

  1. C语言顺序表的基本操作
  2. 使用C语言编写程序,实现顺序表的基本运算——插入和删除。
  3. 顺序表和链表的基本操作,用C语言实现!

C语言顺序表的基本操作

#include stdio.h
#include stdlib.h
typedef int DataType;  // 定义数据数据类型
typedef struct {
    DataType *data;     // data指向数据区的首个数据
    int length;         // 数据长度
} SqList;
void Sort(SqList *L) {
    int i, j, k;
    DataType tmp;
    for (i = 0; i < L->length - 1; ++i) {
        k = i;
        for (j = i + 1; j < L->length; ++j)
            if (L->data[k] < L->data[j])
                k = j;
        if (k != i) {
            tmp = L->data[k];
            L->data[k] = L->data[i];
            L->data[i] = tmp;
        }
    }
}
SqList *CreateList(DataType a[], int n) {
    int i;
    SqList *L;
    L = (SqList *)malloc(sizeof(SqList));
    L->data = (DataType *)malloc(n * sizeof(DataType));
    L->length = n;
    for (i = 0; i < n; ++i) L->data[i] = a[i];
    Sort(L);
    return L;
}
int InsertList(SqList *L, DataType x) {
    int i, j;
    for (i = 0; i < L->length; i++) {
        if (x <= L->data[i]) {
            for (j = L->length; j >= i; j--)
                L->data[j + 1] = L->data[j];  // 结点后移
            L->data[i] = x;
            L->length++;
            return 1;
        }
    }
    L->data[L->length++] = x;
    return 1;
}
int RemoveListElem(SqList *L, DataType d) {
    int i, j;
    for (i = 0; i < L->length; ++i) {
        if (L->data[i] == d) {
            for (j = i; j < L->length - 1; ++j)
                L->data[j] = L->data[j + 1];
            L->length--;
            return 1;
        }
    }
    return 0;
}
SqList *AndList(SqList *A, SqList *B) {  /* A∩B */
    int i, j, k = 0;
    int len = (A->length < B->length) ? B->length : A->length;
    SqList *C = (SqList *)malloc(sizeof(SqList));
    C->length = len;
    C->data = (DataType *)malloc(len * sizeof(DataType));
    for (i = 0; i < A->length; ++i) {
        for (j = 0; j < B->length; ++j) {
            if (A->data[i] == B->data[j]) {
                C->data[k++] = A->data[i];
                break;
            }
        }
    }
    C->length = k;
    return C;
}
SqList *OrList(SqList *A, SqList *B) {  /* A∪B */
    int i, j, flag;
    DataType e;
    SqList *C = (SqList *)malloc(sizeof(SqList));
    C->length = A->length + B->length;
    C->data = (DataType *)malloc(C->length * sizeof(DataType));
    for (i = 0; i < A->length; ++i) C->data[i] = A->data[i];
    for (i = 0; i < B->length; ++i) {
        e = B->data[i];
        flag = 1;
        for (j = 0; j < C->length; ++j) {
            if (e == C->data[j]) {
                flag = 0;
                break;
            }
        }
        if (flag) InsertList(C, e);
    }
    return C;
}
void PrintList(SqList *L) {
    int i;
    for (i = 0; i < L->length; ++i)
        printf("%d ", L->data[i]);
    printf("\n");
}
void FreeList(SqList *L) {
    free(L->data);
    free(L);
}
void main() {
    DataType x;
    DataType arra[] = {36, 24, 31, 5, 90, 65, 70, 39, 37};
    DataType arrb[] = {9, 8, 43, 51, 37, 89, 33, 46, 29, 80, 56};
    int alen = sizeof(arra) / sizeof(arra[0]);
    int blen = sizeof(arrb) / sizeof(arrb[0]);
    SqList *A = CreateList(arra, alen);
    printf("A线性表为: ");
    PrintList(A);
    SqList *B = CreateList(arrb, blen);
    printf("B线性表为: ");
    PrintList(B);
    SqList *C = AndList(A, B);
    SqList *D = OrList(A, B);
    printf(" C = A∩B: ");
    PrintList(C);
    printf(" D = A∪B: ");
    PrintList(D);
    printf("在D表中插入数据 : ");
    scanf("%d", &x);
    InsertList(D, x);
    printf("D表插入x后 :");
    PrintList(D);
    printf("删除D表中数据 : ");
    scanf("%d", &x);
    RemoveListElem(D, x);
    printf("删除x后的D表为 :");
    PrintList(D);
    FreeList(A);
    FreeList(B);
    FreeList(C);
    FreeList(D);
}

使用C语言编写程序,实现顺序表的基本运算——插入和删除。

typedef struct {
    int *elem;
    int length;
    int listsize;
} Sqlist;
status Create_sq(Sqlist *L, int n) {
    int i;
    L->elem = (int *)malloc(100 * sizeof(int));
    if (!L->elem) return 0;
    for (i = 0; i < n; i++)
        scanf("%d", &(L->elem[i]));
    L->length = n;
    L->listsize = 100;
    return 1;
}
status Listinsert_sq(Sqlist *L, int i, int e) {
    int *q, *p, *newbase;
    if (i < 1 || i > L->length + 1) return 0;
    if (L->length == L->listsize) {
        newbase = (int *)realloc(L->elem, (L->listsize + 10) * sizeof(int));
        if (!newbase) exit(-2);
        L->elem = newbase;
        L->listsize += 10;
    }
    q = &(L->elem[i - 1]);
    for (p = &(L->elem[L->length - 1]); p >= q; --p)
        *(p + 1) = *p;
    *q = e;
    ++L->length;
    return 1;
}
int main() {
    Sqlist L1;
    int n, a;
    int i, e;
    printf("\n please input the number of data:\n");
    scanf("%d", &n);
    if (Create_sq(&L1, n) == 1) {
        scanf("%d%d", &i, &e);
        a = Listinsert_sq(&L1, i, e);
        if (a == 1)
            printf("insert success\n");
        else printf("insert false\n");
        printf("the list elements are:\n");
        for (i = 1; i <= L1.length; i++) {
            printf("%d\t", L1.elem[i - 1]);
        }
    }
    return 0;
}

顺序表和链表的基本操作,用C语言实现!

顺序存储的线性表的算法

#include "stdio.h"
#include "stdlib.h"
#define Status int
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define OK 1
#define MAXSIZE 100
typedef int ElemType;
typedef struct list {
    ElemType elem[MAXSIZE];
    int length;
} SqList;
void InitList(SqList *L) {
    L->length = 0;
}
/*建立顺序表*/
void CreateList(SqList *L) {
    int i;
    printf("input the length");
    scanf("%d", &L->length); // 输入表长
    for (i = 1; i <= L->length; i++)
        scanf("%d", &L->elem[i - 1]); // 输入元素
}
// 顺序表的遍历
void printdata(ElemType e) {
    printf("%4d", e);
}
void Traverse(SqList *L, void (*visit)(ElemType e)) {
    int i;
    printf("The elements of the lists are:\n");
    for (i = 1; i <= L->length; i++) {
        if (i % 10 == 0) printf("\n"); // 每行显示10个元素
        visit(L->elem[i - 1]); // 输出表中元素
    }
    printf("\n");
}
// 有序顺序表L中插入元素e使序列仍有序
void Insert(SqList *L, ElemType e) {
    int i, j;
    if (L->length == MAXSIZE) exit(OVERFLOW); // 表满,不能插入
    for (i = 1; i <= L->length && L->elem[i - 1] <= e; i++); // 向后查找
    for (j = L->length; j >= i; j--)
        L->elem[j] = L->elem[j - 1]; // 元素后移
    L->elem[i - 1] = e; // 插入e
    L->length = L->length + 1; // 表长加1
}
// 建立递增有序的顺序表
void CreateList_Sorted(SqList *L) {
    int i, num;
    ElemType e;
    L->length = 0;
    printf("Create a sorted list,Input the length of the list\n");
    scanf("%d", &num);
    printf("Input the data %d numbers\n", num);
    for (i = 1; i <= num; i++) {
        scanf("%d", &e);
        Insert(L, e);
    }
}
/*Merge two sorted lists*/
void MergeList(SqList *La, SqList *Lb, SqList *Lc) {
    int *pa, *pb, *pc;
    if (La->length + Lb->length > MAXSIZE) exit(OVERFLOW);
    else {
        pa = La->elem;
        pb = Lb->elem;
        pc = Lc->elem;
        while (pa < La->elem + La->length && pb < Lb->elem + Lb->length)
            *pc++ = (*pa <= *pb) ? *pa++ : *pb++; /*公共部分合并*/
        while (pa < La->elem + La->length) *pc++ = *pa++; /*R1表的剩余部分放到R的后部*/
        while (pb < Lb->elem + Lb->length) *pc++ = *pb++; /*R2表的剩余部分放到R的后部*/
        Lc->length = La->length + Lb->length; /*R表长*/
    }
}
// 判断元素是否对称,对称返回TRUE 否则返回FALSE
Status Symmetric(SqList *L) {
    int low, high;
    low = 0;
    high = L->length - 1;
    while (low < high)
        if (L->elem[low] == L->elem[high]) {
            low++;
            high--;
        } else return (FALSE);
    return (TRUE);
}
// 顺序表的主函数部分
void main() {
    SqList L1, L2, L;
    int select;
    ElemType e;
    do {
        printf("\n1 insert 2 merge");
        printf("\n3 symmetric 0 exit \n");
        printf("Please select(0--3)\n");
        scanf("%d", &select);
        switch (select) {
            case 1:
                InitList(&L);
                CreateList_Sorted(&L);
                Traverse(&L, printdata);
                printf("\nInput the element of inserted\n");
                scanf("%d", &e);
                Insert(&L, e);
                Traverse(&L, printdata);
                break;
            case 2:
                InitList(&L1);
                CreateList_Sorted(&L1);
                Traverse(&L1, printdata);
                InitList(&L2);
                CreateList_Sorted(&L2);
                Traverse(&L2, printdata);
                InitList(&L);
                MergeList(&L1, &L2, &L);
                Traverse(&L, printdata);
                break;
            case 3:
                InitList(&L);
                CreateList(&L);
                Traverse(&L, printdata);
                if (Symmetric(&L)) printf("Yes!\n"); else printf("Not\n");
                break;
            case 0:
                break;
            default:
                printf("Error! Try again!\n");
        }
    } while (select);
}

单向链表的有关操作示例

#include <stdio.h>
#include <stdlib.h>
typedef int ElemType; // 元素实际类型
typedef struct LNode {
    ElemType data;
    struct LNode *next;
} LNode, *LinkList; // 定义结点、指针类型名
// 头插法建立无序链表
void CreateList(LinkList *L) {
    LinkList p;
    ElemType e;
    *L = (LinkList) malloc(sizeof(LNode));
    (*L)->next = NULL;
    printf("头插法建立链表,以0结束\n");
    scanf("%d", &e);
    while (e) {
        p = (LinkList) malloc(sizeof(LNode));
        p->data = e;
        p->next = (*L)->next;
        (*L)->next = p;
        scanf("%d", &e);
    }
}
/*非递减有序单向链表L插入元素e序列仍有序*/
void Insert_Sort(LinkList *L, ElemType e) {
    LinkList p, s;
    s = (LinkList) malloc(sizeof(LNode));
    s->data = e;
    p = *L;
    while (p->next && p->next->data <= e)
        p = p->next; /*查找插入位置*/
    s->next = p->next; /*插入语句*p结点后插入*s结点*/
    p->next = s;
}
/*建立递增有序的单向链表*/
void Create_Sort(LinkList *L) {
    ElemType e;
    *L = (LinkList) malloc(sizeof(LNode));
    (*L)->next = NULL;
    printf("建立有序表,输入任意个整型数据以0结束\n");
    scanf("%d", &e);
    while (e) {
        Insert_Sort(L, e);
        scanf("%d", &e);
    }
}
/*单向链表的遍历*/
void Traverse(LinkList L) {
    LinkList p;
    printf("遍历链表");
    for (p = L->next; p; p = p->next)
        printf("%5d", p->data);
    printf("\n");
}
/*在单向链表删除元素e*/
void Delete(LinkList L, ElemType e) {
    LinkList p, q;
    p = L;
    q = L->next;
    while (q && q->data != e) { // 查找元素的删除位置
        p = q;
        q = q->next;
    }
    if (!q) printf("\nnot deleted"); /*未找到元素e*/
    else {
        p->next = q->next; /*找到删除*/
        free(q);
    }
}
/*单向链表的逆置*/
void exch(LinkList L) {
    LinkList p, s;
    p = L->next;
    L->next = NULL;
    while (p) {
        s = p;
        p = p->next;
        s->next = L->next;
        L->next = s;
    }
}
/*两个非递减有序单向链表合并后仍为非递减序列*/
void MergeIncrease(LinkList La, LinkList Lb, LinkList Lc) {
    LinkList p, q, s, rear;
    p = La->next;
    q = Lb->next;
    Lc = rear = La;
    free(Lb);
    while (p && q) {
        if (p->data <= q->data) {
            s = p;
            p = p->next;
        } else {
            s = q;
            q = q->next;
        }
        rear->next = s; /*较小元素插入表尾*/
        rear = rear->next;
    }
    if (p) rear->next = p; else rear->next = q;
}
/*主函数部分*/
void main() {
    LinkList La, Lb, Lc;
    ElemType e;
    int select;
    do {
        printf(" 1 建立无序表,再删除指定元素\n");
        printf(" 2 建立递增有序表,再逆置\n");
        printf(" 3 建立两个递增有序表,将它们和并为一个仍递增表\n");
        printf(" 0 退出,请输入选项(0-3)\n");
        scanf("%d", &select);
        switch (select) {
            case 0:
                break;
            case 1:
                CreateList(&La);
                Traverse(La);
                printf("输入需删除的元素\n");
                scanf("%d", &e);
                Delete(La, e);
                Traverse(La);
                break;
            case 2:
                Create_Sort(&La);
                Traverse(La);
                exch(La);
                printf("The list that is exchaged\n");
                Traverse(La);
                break;
            case 3:
                Create_Sort(&La);
                Traverse(La);
                Create_Sort(&Lb);
                Traverse(Lb);
                MergeIncrease(La, Lb, Lc);
                Traverse(Lc);
                break;
            default:
                printf("输入选项错误,请重新输入!\n");
        }
    } while (select);
}

这些内容不知道能不能帮助到你。