算法与数据结构

1.顺序表

手敲的代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct table{
    int *pBase;
    int length;
    int cnt;
    }Student;
//Student p1;
init_arr(Student *p,int length){
    p->pBase=(int *)malloc(sizeof(int)*length);
    p->length=length;
    p->cnt=0;}
append_arr(Student *p,int val){
    p->pBase[p->cnt]=val;
    p->cnt++;
    }
insert_arr(Student *p,int pos,int val){
    //在第pos位置插入值
    int i;
    for(i=0;i<p->cnt;i++){
        printf("插入前:%d
",p->pBase[i]);
    }
    for(i=p->cnt-1;i>=pos-1;i--){
        p->pBase[i+1]=p->pBase[i];
    }
    p->pBase[pos-1]=val;
    p->cnt++;
    for(i=0;i<p->cnt;i++){
        printf("插入后:%d
",p->pBase[i]);
    }
}
delete_arr(Student *p,int pos){
    //删除第pos个位置的值
    int i;
    for(i=pos-1;i<=p->cnt-1;i++){
        p->pBase[i]=p->pBase[i+1];
    }
    p->cnt--;
    for(i=0;i<p->cnt;i++){
        printf("删除后:%d
",p->pBase[i]);
    }
}

int main()
{
    Student *p1;
    init_arr(&p1,10);
    append_arr(&p1,2);
    append_arr(&p1,3);
    append_arr(&p1,8);
    insert_arr(&p1,2,67);
    delete_arr(&p1,3);
    return 0;
}

顺序表的操作,包括初始化、增加元素、插入元素和删除元素。

结构体Student包含三个成员变量,分别是数组首地址、总长度和有效长度

由于顺序表以数组形式存储元素,所以使用数组的表达式(a[0]之类的)很容易完成

运行结果:

2.单链表

1.尾插法创建链表(尾插法是顺序插入的,方法是一开始将尾指针指向头指针,每次插入新元素,就将尾指针指向新元素,并设置尾指针的next为NULL)

手敲的代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
    int data;
    struct NODE *Next;
}NODE,*PNODE;
PNODE create_list(){
    //尾插法
    int len;
    PNODE pNew;
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    PNODE pTail=pHead;
    printf("请输入len:
");
    scanf("%d",&len);
    int i=0,data;
    for(i=0;i<len;i++){
        printf("请输入第%d位的data:
",i);
        scanf("%d",&data);
        PNODE pNew=(PNODE)malloc(sizeof(NODE));
        pNew->data=data;
        pTail->Next=pNew;
        pTail=pNew;
        pNew->Next=NULL;
    }
    return pHead;}
//删除 delete_list(PNODE p,
int pos){ int i; for(i=0;i<pos-1;i++){ p=p->Next; } p->Next=p->Next->Next; }
//插入 insert_list(PNODE p,
int pos,int val){ int i; for(i=0;i<pos-1;i++){ p=p->Next; } PNODE pNew; pNew=(PNODE)malloc(sizeof(NODE)); pNew->data=val; pNew->Next=p->Next; p->Next=pNew; }
//遍历 travel_list(PNODE p){
while(p->Next!=NULL){ p=p->Next; printf("值:%d ",p->data); } } int main() { PNODE pHead; pHead=create_list(); delete_list(pHead,3); insert_list(pHead,4,66); travel_list(pHead); }

结果:

2.头插法创建链表

因为头插法是逆向插入,且不需要尾指针,全靠头指针插入,使用遍历时会发现元素是反着打印的

头插法的特点是头指针的next设为NULL,之后将头指针next赋给新元素的next,最后头指针的next指向新元素

手敲的代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
    int data;
    struct NODE *Next;
}NODE,*PNODE;
PNODE create_list(){
    //头插法
    int len;
    PNODE pNew;
    PNODE pHead = (PNODE)malloc(sizeof(NODE));
    pHead->Next=NULL;
    printf("请输入len:
");
    scanf("%d",&len);
    int i=0,data;
    for(i=0;i<len;i++){
        printf("请输入第%d位的data:
",i);
        scanf("%d",&data);
        PNODE pNew=(PNODE)malloc(sizeof(NODE));
        pNew->data=data;
        pNew->Next=pHead->Next;
        pHead->Next=pNew;
    }
    return pHead;}
delete_list(PNODE p,int pos){
    int i;
    for(i=0;i<pos-1;i++){
        p=p->Next;
    }
    p->Next=p->Next->Next;
    }
insert_list(PNODE p,int pos,int val){
    int i;
    for(i=0;i<pos-1;i++){
        p=p->Next;
    }
    PNODE pNew;
    pNew=(PNODE)malloc(sizeof(NODE));
    pNew->data=val;
    pNew->Next=p->Next;
    p->Next=pNew;
}
travel_list(PNODE p){
    while(p->Next!=NULL){
        p=p->Next;
        printf("值:%d
",p->data);
    }
}
int main()
{   PNODE pHead;
    pHead=create_list();
    delete_list(pHead,3);
    insert_list(pHead,4,66);
    travel_list(pHead);
}

结果:

原文地址:https://www.cnblogs.com/echoDetected/p/13813522.html