数据结构-单链表(Linked List)

#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 10
#define LISTINCREMENT 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

typedef int status;         //函数返回类型
typedef int ElemType;   //数据类型
typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;
} Lnode, *Linklist;

int i,j;
/*
    创建
    添加(在数字i 之前)
    删除i 号元素
    打印链表
    合并链表
    链表排序(比较low)
*/
status CreateList_L(Linklist *L, int n);
status ListInsert_L(Linklist *L, int i, ElemType e);
status ListDelete_L(Linklist *L, int i, ElemType *e);
status ListPrint_L(Linklist L);
status MergeList_L(Linklist *La, Linklist *Lb, Linklist *Lc);
status ListSort_L(Linklist *L, int n);

int main()
{
    Linklist List, L2, L3;
    ElemType e;
    int p;
    printf("Please input 5 number to insert the list_A:\n");
    CreateList_L(&List, 5);
    printf("Please input the element to insert_A:\n");
    scanf("%d", &e);
    printf("Please input the position to insert_A:\n");
    scanf("%d", &p);
    ListInsert_L(&List, p, e);
    printf("After insert,the list is:\n");
    ListPrint_L(List);
    printf("Please input the position to delete_A:\n");
    scanf("%d", &p);
    ListDelete_L(&List, p, &e);
    printf("After delete,the list is:\n");
    ListPrint_L(List);
    printf("Please input 5 number to insert the list_B:\n");
    CreateList_L(&L2, 5);
    ListSort_L(&List, 5);
    ListSort_L(&L2, 5);
    MergeList_L(&List, &L2, &L3);
    ListPrint_L(L3);
    return 0;
}

status CreateList_L(Linklist *L,int n)
{
    Linklist r;
    *L = (Linklist)malloc(sizeof(Lnode));
    (*L)->next = NULL;
    r = *L;
    for (i= 1; i<= n; ++i)
    {
        Linklist p = (Linklist)malloc(sizeof(Lnode));
        scanf("%d", &p->data);
        r->next = p;
        r = p;
    };
    r->next = NULL;
};

status ListInsert_L(Linklist *L, int i, ElemType e)
{
    Linklist p = *L;
    j = 0;
    while (p && j< i- 1)
        p = p->next, ++j;
    if (!p || j> i- 1)
        return ERROR;
    Linklist s = (Linklist)malloc(sizeof(Lnode));
    s->data = e;
    s->next = p->next;
    p->next = s;
    return OK;
}

status ListDelete_L(Linklist *L, int i, ElemType *e)
{
    Linklist p = *L;
    j = 0;
    while (p->next && j< i- 1)
    {
        p=p->next;
        ++j;
    }
    if (!(p->next) || j> i- 1)
        return ERROR;
    Linklist q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return OK;
}

status ListPrint_L(Linklist L)
{
    Linklist temp = L->next;
    while(temp != NULL)
    {
        printf("%d%c",temp->data,temp->next==NULL?'\n':' ');
        temp = temp->next;
    }
    return OK;
}
/*
    不知道为啥MergeList_L老是(内存越界?)错误.
    结论:free问题,自己free了自己应用的内存真是自己犯的错笑着也要改下去:)
*/

status MergeList_L(Linklist *La, Linklist *Lb, Linklist *Lc)
{
    Linklist pa = *La;
    Linklist pb = *Lb;
    pa = pa->next, pb = pb->next;
    Linklist pc = *Lc =  *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 ListSort_L(Linklist *L, int n)
{
    ElemType temp;
    ElemType *a= (ElemType*)malloc(n* sizeof(*a));
    Linklist p,q;
    p= *L;
    q= *L;
    i= 0;
    while(q)
        a[i++]= q->data, q= q->next;
    for(i= 1; i<= n; i++)
        for(j= 1; j<= n- i; j++)
            if(a[j]>a[j+1])
                temp= a[j], a[j]= a[j+1], a[j+1]= temp;
    i= 0;
    while(p)
        p->data= a[i++], p= p->next;
}

转载于:https://www.cnblogs.com/chinashenkai/p/9451405.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用C语言实现链表的例子: ```c #include <stdio.h> #include <stdlib.h> typedef struct node { int value; struct node *next; } Node; typedef struct linked_list { Node *head; } LinkedList; void add(LinkedList *list, int value) { Node *newNode = (Node*)malloc(sizeof(Node)); newNode->value = value; newNode->next = NULL; if (list->head == NULL) { list->head = newNode; } else { Node *current = list->head; while (current->next != NULL) { current = current->next; } current->next = newNode; } } void removeNode(LinkedList *list, int value) { if (list->head == NULL) { return; } if (list->head->value == value) { Node *temp = list->head; list->head = list->head->next; free(temp); return; } Node *current = list->head; while (current->next != NULL && current->next->value != value) { current = current->next; } if (current->next != NULL) { Node *temp = current->next; current->next = current->next->next; free(temp); } } void print(LinkedList *list) { Node *current = list->head; while (current != NULL) { printf("%d ", current->value); current = current->next; } printf("\n"); } int main() { LinkedList *list = (LinkedList*)malloc(sizeof(LinkedList)); list->head = NULL; add(list, 1); add(list, 2); add(list, 3); print(list); removeNode(list, 2); print(list); return 0; } ``` 这个链表包含了三个函数:add、removeNode和print。add函数用于向链表中添加一个元素,removeNode函数用于从链表中删除一个元素,print函数用于打印链表中所有元素的值。使用这个链表,我们可以方便地对一系列元素进行管理和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值