标签:单链表 c 增删查改
单链表:单向无循环,最后置于空
//SeqList.h
#pragma once #include<string.h> #include<stdlib.h> #include<assert.h> #define MAX_SIZE 100 typedef int DataType; typedef struct Seqlist { DataType *_array; size_t _size; size_t _capacity; }Seqlist; void InitSeqlist(Seqlist *pSeq)//初始化 { assert(pSeq); pSeq->_capacity=MAX_SIZE; pSeq->_array=(DataType*)malloc(sizeof(DataType)*pSeq->_capacity); pSeq->_size=0; } void print(Seqlist *pSeq)//输出各数 { int i=0; assert(pSeq); for(;i<pSeq->_size;++i) { printf("%d ",pSeq->_array[i]); } printf("\n"); } void WideCapacity(Seqlist *pSeq)//增容 { if(pSeq->_size>=pSeq->_capacity) { DataType *tmp=0; pSeq->_capacity*=2; tmp=(DataType *)malloc(sizeof(DataType)*pSeq->_capacity); memcpy(tmp,pSeq->_array,sizeof(DataType)*pSeq->_size); free(pSeq->_array); pSeq->_array=tmp; } } void PushBack(Seqlist *pSeq,DataType x)//尾部增加 { assert(pSeq); if(pSeq->_size>=pSeq->_capacity) { WideCapacity(pSeq); } pSeq->_array[pSeq->_size++]=x; } void PopBack(Seqlist *pSeq)//尾部删除 { assert(pSeq); if(pSeq->_size==0) { printf("该顺序表已空,无法删除!\n"); return; } --pSeq->_size; } void PushFront(Seqlist *pSeq,DataType x)//首部增加 { int i=pSeq->_size; assert(pSeq); if(pSeq->_size>=pSeq->_capacity) { WideCapacity(pSeq); } for(;i>0;--i) { pSeq->_array[i]=pSeq->_array[i-1]; } pSeq->_array[0]=x; ++pSeq->_size; } void PopFront(Seqlist *pSeq)//首部删除 { int i=0; assert(pSeq); if(pSeq->_size==0) { printf("该顺序表已空,无法删除!\n"); return; } for(;i<pSeq->_size;++i) { pSeq->_array[i]=pSeq->_array[i+1]; } --pSeq->_size; } void Insert(Seqlist *pSeq,size_t pos,DataType x)//插入 { int i=pSeq->_size-1; assert(pSeq); assert(pos<=pSeq->_size); if(pSeq->_size>=pSeq->_capacity) { WideCapacity(pSeq); } for(;i>=(int)pos;--i) { pSeq->_array[i+1]=pSeq->_array[i]; } pSeq->_array[pos]=x; ++pSeq->_size; } void Remove(Seqlist *pSeq,DataType x)//删除某个数(第一个) { int i=0; assert(pSeq); assert(pSeq->_size!=0); for(;i<pSeq->_size;++i) { if(pSeq->_array[i]==x) { int start=i; for(;start<pSeq->_size;++start) { pSeq->_array[start]=pSeq->_array[start+1]; } --pSeq->_size; return; } } } void RemoveAll(Seqlist *pSeq,DataType x)//删除某个数(全部) { ///////////// 第一种方法: ////////////// //int i=0; //assert(pSeq); //assert(pSeq->_size!=0); //for(;i<pSeq->_size;++i) //{ // if(pSeq->_array[i]==x) // { // int start=i; // for(;start<pSeq->_size;++start) // { // pSeq->_array[start]=pSeq->_array[start+1]; // } // --pSeq->_size; // --i; // } //} /////////////// 第二种方法: ///////////// int count=0; int firstIndex=0; int nextIndex=0; assert(pSeq); assert(pSeq->_size!=0); while(nextIndex<pSeq->_size) { if(pSeq->_array[nextIndex]==x) { --pSeq->_array[nextIndex]; } else { pSeq->_array[firstIndex]=pSeq->_array[nextIndex]; ++firstIndex; count++; } ++nextIndex; } pSeq->_size=count; } int Find(Seqlist *pSeq,DataType x)//查找某个数 { int i=0; assert(pSeq); assert(pSeq->_size!=0); for(;i<pSeq->_size;++i) { if(pSeq->_array[i]==x) { return 1; } } } void Modify(Seqlist *pSeq,size_t pos,DataType x)//修改数据 { int i=0; assert(pSeq); assert(pos<=pSeq->_size); assert(pSeq->_size!=0); for(;i<=(int)pos;++i) { if(i==pos) { pSeq->_array[i]=x; } } } void Erase(Seqlist *pSeq,size_t pos)//抹除某个下标的值 { int i=0; assert(pSeq); assert(pos<=pSeq->_size); assert(pSeq->_size!=0); for(;i<pSeq->_size;++i) { if(i==pos) { int start=i; for(;start<pSeq->_size;++start) { pSeq->_array[start]=pSeq->_array[start+1]; } --pSeq->_size; return; } } }
//Test.cpp 测试用例
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include "Seqlist.h" void Test1()//尾部操作 { Seqlist s; InitSeqlist(&s); PushBack(&s,1); PushBack(&s,2); PushBack(&s,3); PushBack(&s,4); print(&s); PopBack(&s); print(&s); } void Test2()//首部操作 { Seqlist s; InitSeqlist(&s); PushFront(&s,4); PushFront(&s,3); PushFront(&s,2); PushFront(&s,1); PushFront(&s,0); print(&s); PopFront(&s); print(&s); } void Test3()//任意位置操作 { Seqlist s; InitSeqlist(&s); PushFront(&s,4); PushFront(&s,2); PushFront(&s,2); PushFront(&s,3); PushFront(&s,2); PushFront(&s,1); print(&s); Insert(&s,1,0); print(&s); Remove(&s,2); print(&s); RemoveAll(&s,2); print(&s); } void Test4(int k)//查找 { int ret=0; Seqlist s; InitSeqlist(&s); PushFront(&s,4); PushFront(&s,3); PushFront(&s,2); PushFront(&s,1); PushFront(&s,0); print(&s); ret=Find(&s,k); if(ret==1) { printf("该顺序表中存在该数!\n"); } else { printf("该顺序表中不存在该数!\n"); } } void Test5()//修改、抹除 { Seqlist s; InitSeqlist(&s); PushFront(&s,3); PushFront(&s,2); PushFront(&s,1); PushFront(&s,0); print(&s); Modify(&s,3,1); print(&s); Erase(&s,1); print(&s); } int main() { int k=0; printf("尾部操作 \n"); Test1(); printf("首部操作 \n"); Test2(); printf("任意位置操作 \n"); Test3(); printf("查找某数 \n"); printf("请输入数字:"); scanf("%d",&k); Test4(k); printf("修改某数、抹除下标的值 \n"); Test5(); system("pause"); return 0; }
本文出自 “花开彼岸” 博客,请务必保留此出处http://zxtong.blog.51cto.com/10697148/1757666
标签:单链表 c 增删查改
原文地址:http://zxtong.blog.51cto.com/10697148/1757666