数据结构||单链表功能的实现

单链表的一些基本功能实现
1.写头文件的文档

#ifndef _COMMON_

 #define _COMMON_      
      
                
                
 #include<stdio.h>
      
      
        
        #include<stdlib.h>
      
      
        
        #include<stdbool.h>
      
      
        
        #include<assert.h>
      
      
        
        #define DataType int
      
      
        
        

      
      
        
        typedef struct SListNode
      
      
        
        {
      
      
        
        	DataType data;//单链表的数据域
      
      
        
        	struct SListNode* next;//单链表的指针域
      
      
        
        }SListNode;
      
      
        
        

      
      
        
        typedef struct SList
      
      
        
        {
      
      
        
        	SListNode *First;
      
      
        
        	SListNode *Last;
      
      
        
        	size_t size;
      
      
        
        }SList;//链表中的头和尾指针 都要用结构体定义类型.
      
      
        
        SListNode* _Buynode(DataType x);
      
      
        
        void InitList(SList* plist);
      
      
        
        bool SListpushback(SList* plist,DataType x);
      
      
        
        void SListshowlist(SList* plist);
      
      
        
        bool SListpushfront(SList* plist,DataType x);
      
      
        
        bool SListPopBack(SList* plist, DataType x);
      
      
        
        SListNode* SListFindByVal(SList* plist, DataType x);
      
      
        
        bool SListDeleByVal(SList* plist, DataType x);
      
      
        
        bool SListPopFront(SList* plist, DataType x);
      
      
        
        SListNode* ReservrList(SList* plist);
      
      
        
        int SListLength(SList* plist);
      
      
        
        void SListClear(SList* plist);
      
      
        
        void DestorySList(SList* plist);
      
      
        
        void InsertByVal(SList* plist,DataType x);
      
      
        
        #endif

2.主函数的测试

#include"common.h"
      
      
        
        int main()
      
      
        
        {
      
      
        
        	SList mylist;
      
      
        
        	InitList(&mylist);
      
      
        
        	DataType select = 1;
      
      
        
        	DataType input = 0;
      
      
        
        	DataType ret = 0;
      
      
        
        	while (select)
      
      
        
        	{
      
      
        
        		printf("*****************************************\n");
      
      
        
        		printf("*****1.push_back  2.push_front***********\n");
      
      
        
        		printf("*****3.show_list  0.   exit   ***********\n");
      
      
        
        		printf("*****5.pop_back   6.pop_front ***********\n");
      
      
        
        		printf("*****7.FindByVal  8. reserve    *********\n");
      
      
        
        		printf("*****9.DeleByVal  10.Length**************\n");
      
      
        
        		printf("*****11.Clear     12.InsertByVal*********\n");
      
      
        
        		printf("*****13.Destory            **************\n");
      
      
        
        		printf("*****************************************\n");
      
      
        
        		printf("请选择>");
      
      
        
        		scanf_s("%d", &select);


      
        		if (select == 0)

      
      
        
        		{
      
      
        
        			break;
      
      
        
        		}
      
      
        
        		switch (select)
      
      
        
        		{
      
      
        
        		case 1:
      
      
        
        			printf("请输入你要插入的数据>");
      
      
        
        			while (scanf_s("%d",&input),input!=-1)
      
      
        
        			{
      
      
        
        				SListpushback(&mylist,input);
      
      
        
        			}
      
      
        
        			break;
      
      
        
        		case 2:
      
      
        
        			printf("请输入你要插入的数据>");
      
      
        
        			while (scanf_s("%d", &input), input != -1)
      
      
        
        			{
      
      
        
        				SListpushfront(&mylist, input);
      
      
        
        			}
      
      
        
        			break;
      
      
        
        		case 3:
      
      
        
        			SListshowlist(&mylist);
      
      
        
        			break;
      
      
        
        		case 5:
      
      
        
        			printf("请输入你要删除的数据>");


        			SListPopBack(&mylist, input);
      
      
        
        			break;
      
      
        
        		case 6:
      
      
        
        			printf("请输入你要删除的数据>");
      
      
        
        			SListPopFront(&mylist, input);
      
      
        
        			break;
      
      
        
        		case 7:
        		printf("请输入你要查找的数字>");
      
      
        
        			SListFindByVal(&mylist, input);
      
      
        
        			break;
      
      
        
        		case 8:
      
      
        
        			ReservrList(&mylist);
      
      
        
        			break;
      
      
        
        		case 9:
      
      
        
        			printf("请输入你要删除数据>");
      
      
        
        			SListDeleByVal(&mylist,input);
      
      
        
        			break;
      
      
        
        		case 10:
      
      
        
        		    ret = SListLength(&mylist);
      
      
        
        			printf("%d\n", ret);
      
      
        
        			break;
      
      
        
        		case 11:
      
      
        
        			SListClear(&mylist);
      
      
        
        			break;
      
      
        
        		case 12:
      
      
        
        			printf("请输入你要插入的数据>");
      
      
        
        			scanf_s("%d", &input);
      
      
        
        			InsertByVal(&mylist, input);
      
      
        
        			break;
      
      
        
        		case 13:
      
      
        
        			DestorySList(&mylist);
      
      
        
        			break;
      
      
        
        		default :
      
      
        
        			printf("输入不合法>");
      
      
        
        			break;
      
      
        
        		}
      
      
        
        	}
      
      
        
        	return 0;
      
      
        
        }

3.函数的实现

#include"common.h"
      
      
        
        SListNode* _Buynode(DataType x)
      
      
        
        {
      
      
        
        	SListNode* S = (SListNode*)malloc(sizeof(SListNode));
      
      
        
        	assert(S != NULL);
      
      
        
        	if (S == NULL)
      
      
        
        		return NULL;
      
      
        
        	S->next = NULL;
      
      
        
        	S->data = x;
      
      
        
        	return S;
      
      
        
        }
      
      
        
        void InitList(SList* plist)
      
      
        
        {
      
      
        
        	SListNode *S = _Buynode(0);
      
      
        
        	plist->First = plist->Last = S;
      
      
        
        	plist->size = 0;
      
      
        
        }
      
      
        
        bool SListpushback(SList* plist,DataType x)
      
      
        
        {
      
      
        
        	SListNode* S = _Buynode(x);
      
      
        
        	if (S == NULL)
      
      
        
        		return false;
      
      
        
        	plist->Last->next = S;
      
      
        
        	plist->Last = S;
      
      
        
        	plist->size++;
      
      
        
        	return true;
      
      
        
        }
      
      
        
        bool SListpushfront(SList* plist,DataType x)
      
      
        
        {
      
      
        
        	assert(plist != NULL);
      
      
        
        	
      
      
        
        	SListNode* p = _Buynode(x);
      
      
        
        	if (p == NULL)
      
      
        
        		return false;
      
      
        
        	p->next = plist->First->next;
      
      
        
        	plist->First->next = p;
      
      
        
        	if (plist->size == 0)
      
      
        
        		plist->Last = p;
      
      
        
        	plist->size++;
      
      
        
        	return true;
      
      
        
        }
      
      
        
        void SListshowlist(SList* plist)
        {
      
      
        
        	SListNode* p = plist->First->next;
      
      
        
        	while (p != NULL)
      
      
        
        	{
      
      
        
        		printf("%d-->", p->data);
      
      
        
        		p = p->next;
      
      
        
        	}
      
      
        
        	printf("over.\n");
      
      
        
        }
      
      
        
        bool SListPopBack(SList* plist, DataType x)
      
      
        
        {
      
      
        
        	SListNode* p = plist->First;
      
      
        
        	assert(plist != NULL);
      
      
        
        	if (plist->size == 0)
      
      
        
        	{
      
      
        
        		return false;
      
      
        
        	}
      
      
        
        	while (p->next!=plist->Last)
      
      
        
        	{
      
      
        
        		p = p->next;
      
      
        
        	}
      
      
        
        	p->next = NULL;
      
      
        
        	free(plist->Last);
      
      
        
        	plist->Last = p;
      
      
        
        	plist->size--;
      
      
        
        	return true;
      
      
        
        }
      
      
        
        bool SListPopFront(SList* plist, DataType x)
      
      
        
        {
      
      
        
        	SListNode* p = plist->First->next;
      
      
        
        	if (plist->size == 0)
      
      
        
        		return false;
      
      
        
        	plist->First->next = p->next;
      
      
        
        	free(p);
      
      
        
        	plist->size--;
      
      
        
        	if (plist->size == 0)
      
      
        
        		plist->Last = plist->First;
      
      
        
        		return true;
      
      
        
        }
      
      
        
        SListNode* SListFindByVal(SList* plist, DataType x)
        {
        SListNode* p = plist->First->next;
      
      
        
        	/*while (p != NULL && p->data != x)
      
      
        
        		p = p->next;
      
      
        
        	return p;*/
      
      
        
        	while (p != NULL)
      
      
        
        	{
      
      
        
        		if (p->data == x)
      
      
        
        		{
      
      
        
        			return p;
      
      
        
        		}
      
      
        
        		p = p->next;
      
      
        
        	}
      
      
        
        	return NULL;
      
      
        
        }
      
      
        
        SListNode* ReservrList(SList* plist)
      
      
        
        {
      
      
        
        	SListNode* q;
      
      
        
        	SListNode* p;
      
      
        
        	if (plist->First->next&&plist->First->next->next)
      
      
        
        	{
      
      
        
        		p = plist->First->next;
      
      
        
        		q = p->next;
      
      
        
        		p->next = NULL;
      
      
        
        		while (q)
      
      
        
        		{
      
      
        
        			p = q;
      
      
        
        			q = q->next;
      
      
        
        			p->next = plist->First->next;
      
      
        
        			plist->First->next = p;
      
      
        
        		}
      
      
        
        		return plist->First;
      
      
        
        	}
      
      
        
        	return plist->First;
      
      
        
        }
      
      
        
        int SListLength(SList* plist)
      
      
        
        {
        	return plist->size;
      
      
        
        }
      
      
        
        void SListClear(SList* plist)
      
      
        
        {
      
      
        
        	SListNode* p = plist->First->next;
      
      
        
        	while (p != NULL)
      
      
        
        	{
      
      
        
        		plist->First->next = p->next;
      
      
        
        		free(p);
      
      
        
        		p = plist->First->next;
      
      
        
        	}
      
      
        
        	plist->First = plist->Last = NULL;
      
      
        
        	plist->size = 0;
      
      
        
        

      
      
        
        }
      
      
        
        void DestorySList(SList* plist)
      
      
        
        {
      
      
        
        	SListClear(plist);
      
      
        
        	free(plist->First);
      
      
        
        	plist->First = plist->Last = NULL;//防止在内存中成为野指针
      
      
        
        }
      
      
        
        void InsertByVal(SList* plist, DataType x)
      
      
        
        {
      
      
        
        	SListNode* p = plist->First;
      
      
        
        	while (p->next != NULL&&x > p->next->data)
      
      
        
        	{
      
      
        
        		p = p->next;
      
      
        
        	}
      
      
        
        	SListNode* s = _Buynode(x);
      
      
        
        	if (p->next == NULL)
      
      
        
        	{
      
      
        
        		p->next = s;
      
      
        
        		plist->Last = s;
      
      
        
        	}
      
      
        
        	else
      
      
        
        	{
      
      
        
        		s->next = p->next;
      
      
        
        		p->next = s;
      
      
        
        	}
      
      
        
        	plist->size++;
        	}
      
      
        
        bool SListDeleByVal(SList* plist, DataType x)
      
      
        
        {
      
      
        
        	SListNode* q;
      
      
        
        	SListNode* p = plist->First;
      
      
        
        

      
      
        
        	while (p != NULL && p->next->data != x)
      
      
        
        		p = p->next;
      
      
        
        	if (p == NULL)
      
      
        
        		return false;
      
      
        
        	q = p->next;
      
      
        
        	if (p->next == plist->Last)
      
      
        
        		plist->Last = p;
      
      
        
        	p->next = q->next;
      
      
        
        	free(q);
      
      
        
        	return true;
      
      
        
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值