当前位置 博文首页 > 奋斗的小跳蛙的博客:线性表的建立及操作详解 菜鸟都能看懂的教

    奋斗的小跳蛙的博客:线性表的建立及操作详解 菜鸟都能看懂的教

    作者:[db:作者] 时间:2021-09-17 15:15

    线性表按照存储方式可以分为顺序存储和链式存储.
    我们先来实现顺序表,借助一维数组来实现

    定义顺序表

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<assert.h>
    #define  MAXSIZE 100
    typedef struct List
    {
    	int data[MAXSIZE];
    	int length;
    }List;
    

    初始化顺序表

    void initList(List * plist)
    {
    	assert(plist);
    	memset(plist->data, 0, MAXSIZE * 4);
    	plist->length = 0;
    }
    

    判断顺序表是否为空

    int ListEmpty(List * plist)
    {
    	assert(plist);
    	//空为0,非空为-1;
    	if (plist->length == 0)
    		return 0;
    	else
    		return -1;
    }
    

    清空顺序表

    void clearList(List * plist)
    {
    	assert(plist);
    	plist->length = 0;
    }
    

    寻找第i个元素

    int GetElem(List * plist, int i, int *e)
    {
    	//成功为0,不成功为-1;
    	assert(plist);
    	if (i<1 || i>plist->length||plist->length == 0)
    		return -1;
    	*e = plist->data[i - 1];
    	return 0;
    }
    

    寻找元素e在顺序表中的位置

    int LocateElem(List *plist, int e)
    {	
    	int i;
    	assert(plist);
    	for (i = 1; i <= plist->length; i++)
    	{
    		if (plist->data[i] == e)
    		{
    			return i;
    		}
    	}
    	return 0;
    }
    

    在第i个位置插入数据e

    int ListInsert(List *plist, int i,int e)
    {
    	int k;
    	//插入成功为0,失败为-1;
    	assert(plist);
    	if (plist->length == MAXSIZE)
    		return -1;
    	if (i<1 || i>plist->length + 1)
    		return -1;
    	
    	for (k = plist->length - 1; k >= i - 1; k--)
    	{
    		plist->data[k + 1] = plist->data[k];
    	}
    	plist->data[i-1] = e;
    	plist->length++;
    	return 0;
    }
    

    删除第i个位置的元素,用e返回值

    int ListDelete(List * plist, int i, int *e)
    {
    	int k;
    	assert(plist);
    	if (i<1 || i>plist->length + 1)
    		return -1;
    	if (plist->length == 0)
    		return -1;
    	*e = plist->data[i - 1];
    	for (k = i - 1; k < plist->length; k++)
    	{
    		plist->data[k] = plist->data[k + 1];
    	}
    	plist->length--;
    	return e;
    }
    

    得到顺序表长度

    int ListLength(List *plist)
    {
    	return plist->length;
    }
    void print(List *plist)
    {
    	for (int i = 0; i < plist->length; i++)
    	{
    		printf("%d ", plist->data[i]);
    	}
    }
    

    主函数

    int main()
    {
    	List p;
    	List * plist = &p;
    	initList(plist);
    	ListInsert(plist, 1, 34);
    	ListInsert(plist, 2, 3);
    	ListInsert(plist, 3, 35);
    	ListInsert(plist, 1, 6);
    	ListInsert(plist, 2, 45);
    	ListInsert(plist, 6, 55);
    	int e, k, pp;
    	//GetElem(plist,5, &e);
    	print(plist);
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    链表实现

    单链表的定义

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<assert.h>
    typedef struct ListNode
    {
    	struct ListNode * next;
    	int data;
    }ListNode;
    typedef struct Link
    {
    	struct ListNode * head;
    }Link;
    

    初始化单链表

    void initLink(Link * plist)
    {
    	assert(plist);
    	plist->head = NULL;
    }
    

    销毁单链表

    void ListDestroy(Link* plist)
    {
    	assert(plist);
    	ListNode * tmp;
    	while (plist->head)
    	{
    		tmp = plist->head;
    		plist->head = plist->head->next;
    		free(tmp);
    	}
    }
    

    头插

    void PushFront(Link * plist, int x)
    {
    	assert(plist);
    	ListNode * tmp = (ListNode *)malloc(sizeof(ListNode));
    	tmp->data = x;
    	tmp->next = plist->head;
    	plist->head = tmp;
    }
    

    头删

    void  PopFront(Link *plist)
    {
    	assert(plist);
    	ListNode * tmp;
    	if (plist->head != NULL)
    	{
    		tmp = plist->head;
    		plist->head = tmp->next;
    		free(tmp);
    	}
    }
    

    查找

    ListNode * Listfind(Link * plist,int x)
    {
    	assert(plist);
    	ListNode * tmp;
    	for (tmp = plist->head; tmp; tmp=tmp->next)
    	{
    		if (tmp->data == x)
    		{
    			return tmp;
    		}
    	}
    	return NULL;
    }
    

    第i个位置上插入x

    int  LinkInsert(Link* plist,int i,int x)
    {
    	int j=1;
    	assert(plist);
    	ListNode * tmp = plist->head;
    	while (tmp&&j < i-1)
    	{
    		tmp = tmp->next;
    		j++;
    	}
    	while (!tmp || j > i)
    	{
    		return -1;
    	}
    	ListNode * cur = (ListNode*)malloc(sizeof(ListNode));
    	cur->data = x;
    	if (i == 1)
    	{
    		cur->next = plist->head;
    		plist->head = cur;
    	}
    	else
    	{
    		cur->next = tmp->next;
    		tmp->next = cur->next;
    
    	}
    	return 0;
    }
    

    删除第i个位置上的元素

    int LinkRemove(Link*plist, int i,int *e)
    {
    	assert(plist);
    	int j=1;
    	ListNode * tmp = plist->head;
    	while (tmp&&j < i - 1)
    	{
    		tmp = tmp->next;
    		j++;
    	}
    	if (!tmp || j > i )
    	{
    		return -1;
    	}
    	if (i == 1)
    	{
    		ListNode *y = plist->head;
    		*e = y->data;
    		plist->head = y->next;
    		free(y);
    	}
    	else {
    		ListNode * y = tmp->next;
    		*e = y->data;
    		tmp->next = tmp->next->next;
    		free(y);
    	}
    	return 0;
    }
    

    打印单链表

    void print(Link * plist)
    {
    	assert(plist);
    	ListNode * tmp;
    	for (tmp = plist->head; tmp; tmp = tmp->next)
    	{
    		printf("%d->", tmp->data);
    	}
    }
    

    主函数

    int main()
    {
    	Link L;
    	Link * plist = &L;
    	initLink(plist);
    	PushFront(plist, 1);
    	PushFront(plist, 2);
    	PushFront(plist, 3);
    	PushFront(plist, 4);
    	PushFront(plist, 5);
    	int e;
    	LinkInsert(plist, 1, 10);
    	//LinkRemove(plist,1, &e);
    //	printf("%d\n", e);
    
    	print(plist);
    	
    	system("pause");
    	return 0;
    }
    

    在这里插入图片描述

    cs
    下一篇:没有了