数据结构——02线性表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、线性表是什么?

1.概念

零个或多个数据元素的有限序列。元素之间是有顺序了,如果存在多个元素,第一个元素无前驱,最有一个没有后继,其他的元素只有一个前驱和一个后继。
当线性表元素的个数n(n>=0)定义为线性表的长度,当n=0时,为空表。在非空的表中每个元素都有一个确定的位置,如果a1是第一个元素,那么an就是第n个元素。

2.优缺点

	优点:
	1,无需为表中的逻辑关系增加额外的存储空间
	2,可以快速随机访问元素O(1)
	缺点:
	1,插入,删除元素需要移动元素o(n)
	2,无法动态存储。

二、源码

1.结构

	.
├── all
├── fun.c
├── fun.o
├── head.h
├── main.c
├── main.o
└── Makefile

0 directories, 7 files

2.源文件

代码如下(示例):
fun.c

#include "head.h"
SeqList *CreateSeqList(int len)
{
	SeqList* temp = malloc(sizeof(SeqList));
	if(NULL == temp)
	{
		perror("malloc error");
		exit(1);
	}
	temp->head = malloc(sizeof(DATATYPE)*len);
	if(NULL == temp->head)
	{
		perror("malloc error 2");
		exit(1);
	}
	temp->tlen = len;
	temp->clen = 0;
	return temp;
}
int DestroySeqList(SeqList **list)
{
	if(NULL == *list)
	{
		printf("*list is NULL");
		return -1;
	}
	free((*list)->head);
	free(*list);
	*list = NULL;
	return 0;
}
int ShowSeqList(SeqList *list)
{
	
	if(IsEmptySeqList(list))
	{
		return -1;
	}
	int i = 0;
	for(i=0;i<list->clen;++i)
	{
		printf("name = %s sex = %c age = %d grade = %d\n"
				,list->head[i].name
				,list->head[i].sex
				,list->head[i].age
				,list->head[i].score);
	}
	return 0;
}
int InsertTailSeqList(SeqList *list, DATATYPE *data)
{
	if(IsFullSeqList(list))
	{
		return -1;
	}
	memcpy(&list->head[list->clen],data,sizeof(*data));
	list->clen++;
	return 0;
}
int IsFullSeqList(SeqList *list)
{
	if(list->tlen == list->clen)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int IsEmptySeqList(SeqList *list)
{
	return 0 == list->clen;
}
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos)
{
	int i =0;
	if(pos >= 0 && pos <list->clen+1)
	{
		for(i=0;i<list->clen-pos;++i)
		{
			memcpy(&list->head[list->clen-i],&list->head[list->clen-1-i],sizeof(*data));
		}
		memcpy(&list->head[pos],data,sizeof(*data));
		list->clen++;
	}
	else
	{
		printf("pos is error\n");
		return -1;	
	}

	return 0;
}
int FindSeqList(SeqList *list, char *name)
{
	int i =0 ;
	for(i=0;i<list->clen;++i)
	{
		if(0 == strcmp(list->head[i].name,name))

		{
			return i;
		}
	}
	return -1;
}
int ReviseSeqList(SeqList *list, char *old, DATATYPE *new)
{
	int ret = FindSeqList(list,old);
	if(ret>=0)
	{
		memcpy(&list->head[ret],new,sizeof(*new));
	}
	else
	{
		printf("old data not in this list\n");
		return -1;
	}
	return 0;
}
int DeleteSeqList(SeqList *list, char *name)
{
	int i= 0;
	int ret = FindSeqList(list,name);
	memset(&list->head[ret],0,sizeof(DATATYPE));
	if(ret>=0)
	{
		for(i=0;i<list->clen-ret;++i)
		{
			memcpy(&list->head[ret+i],&list->head[ret+1+i],sizeof(DATATYPE));
		}
		list->clen--;
	}
	else
	{
		printf("old data not in this list\n");
		return -1;
	}
	return 0;
}
int ClearSeqList(SeqList *list)
{
	list->clen =0;
	return 0;
}

head.h

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct person
{
	char name[32];
	char sex;
	int age;
	int score;
}DATATYPE;

typedef struct list
{
	DATATYPE *head;
	int tlen;
	int clen;
}SeqList;
SeqList *CreateSeqList(int len);
int DestroySeqList(SeqList **list);
int ShowSeqList(SeqList *list);
int InsertTailSeqList(SeqList *list, DATATYPE *data);
int IsFullSeqList(SeqList *list);
int IsEmptySeqList(SeqList *list);
int InsertPosSeqList(SeqList *list, DATATYPE *data, int pos);
int FindSeqList(SeqList *list, char *name);
int ReviseSeqList(SeqList *list, char *old, DATATYPE *new);
int DeleteSeqList(SeqList *list, char *name);
int ClearSeqList(SeqList *list);



#endif

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
	DATATYPE data[] = {
		{"zhangsan",'f',18,99},
		{"lisi",'f',18,99},
		{"waner",'f',18,99},	
		{"xiaowang",'f',18,99},
	};
	DATATYPE new = {"niuda",'f',18,99};
	SeqList* list = CreateSeqList(10);
	InsertTailSeqList(list,&data[0]);
	InsertTailSeqList(list,&data[1]);
	InsertTailSeqList(list,&data[2]);
	InsertPosSeqList(list,&data[3],3);
	DeleteSeqList(list,"lisi");
	ShowSeqList(list);
	DestroySeqList(&list);
	return 0;
}

makefile

OBJ=all
SRC=main.o fun.o
CC=gcc
LFLAG=-g -lm
$(OBJ):$(SRC)
	$(CC) $^ -o $@ $(LFLAG) 
%.o:%.c
	$(CC) -c $< -o $@ 

clean:
	rm $(OBJ)
disclean:
	rm $(OBJ) *.o


三、单项链表

C++版本:

#include <iostream>

using namespace std;
class Node
{

public:
    Node(int value =0 ,Node*pnext = nullptr):data(value),next(pnext)
    {

    }
    int data;
    Node* next;
};

class List
{
public:
    List():pHead(nullptr)
    {

    }
    List(const List&other);
    ~List();
    bool isEmpty();
    void showList();
    void pushFront(int data);
    void pushBack(int data);
    void popFront();
    void popback();
    void free();
    size_t size();


private:
    Node * pHead;
};
void List::pushFront(int data)
{
    Node*newNode = new Node(data,pHead);
    pHead = newNode;
}
List:: List(const List&other):pHead(other.pHead)
{
    pHead = nullptr;
    Node*temp = other.pHead;
    while(temp)
    {
//        pushBack(temp->data);
        pushFront(temp->data);
        temp = temp->next;
    }

}
List::~List()
{
    free();
}
void List::showList()
{
    Node*temp=pHead;
    while(temp )
    {
        cout<<temp->data<<endl;

        temp = temp->next;
    }
}
size_t List::size()
{
    size_t count = 0;
    Node *temp = pHead;
    while(temp)
    {
        count++;
        temp = temp->next;
    }
    return count;
}
void List::pushBack(int data)
{
    Node*newnode = new Node(data);
    if(pHead == nullptr)
    {
        pHead = newnode;
    }
    else
    {
        Node*temp = pHead;
        while(temp->next)
        {
            temp = temp->next;
        }
        temp->next = newnode;
    }
}
bool List::isEmpty()
{
    return pHead== nullptr;
}
void List::popFront()
{
    if(!isEmpty())
    {
        Node*temp = pHead;
        pHead = temp->next;
        delete temp;
    }
}
void  List::popback()
{
    if(!isEmpty())
    {
        Node*temp = pHead;
        if(temp->next==nullptr)
        {
            popFront();
        }
        else
        {
            while(temp->next->next)
            {
                temp=temp->next;
            }
            delete temp->next;
            temp->next = nullptr;
        }


    }
}

void List::free()
{
    while(!isEmpty())
    {
        popFront();
    }
}
int main()
{
    List l;
    l.pushBack(1);
    l.pushBack(2);
    l.pushBack(3);
    l.pushBack(4);
    l.showList();

    {
        List ll(l);
        ll.showList();
    }
    cout << "Hello World!" << endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值