扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如何用C语言或C++实现一个List类?
建网站原本是网站策划师、网络程序员、网页设计师等,应用各种网络程序开发技术和网页设计技术配合操作的协同工作。创新互联专业提供成都做网站、成都网站设计,网页设计,网站制作(企业站、响应式网站、电商门户网站)等服务,从网站深度策划、搜索引擎友好度优化到用户体验的提升,我们力求做到极致!
C语言没有类的概念。C++有现成的List类, #includelist即可。
如果要自己实现可以参考C++数据结构的书籍,是最基本的练习。
这里实现一个简单的例程,请参考:
#include iostream#include fstream#include stdlib.h#include string.husing namespace std;#includestdio.h#includestring#include "math.h"templateclass T class List{public: List() 构造函数 { pFirst = NULL; } void Add(T t) 在Link表头添加新结点 { if(pFirst == NULL) { pFirst = new Node; *(pFirst-pT) = t; } else { Node* pNewNode = new Node; *(pNewNode-pT) = t; pNewNode-pNext = pFirst; pFirst = pNewNode; } } void Remove(T t) 在Link中删除含有特定值的元素 { Node* pNode = pFirst; if(*(pNode-pT) == t) { pFirst = pFirst-pNext; delete pNode; return; } while(pNode != NULL) { Node* pNextNode = pNode-pNext; if(pNextNode!=NULL) { if(*(pNextNode-pT) == t) { pNode-pNext = pNextNode-pNext; delete pNextNode; return; } } else return;没有相同的 pNode = pNode-pNext; } } T* Find(T t) 查找含有特定值的结点 { Node* pNode = pFirst; while(pNode != NULL) { if(*(pNode-pT) == t) { return pNode-pT; } pNode = pNode-pNext; } return NULL; } void PrintList() 打印输出整个链表 { if(pFirst == NULL) { cout"列表为空列表!"endl; return; } Node* pNode = pFirst; while(pNode != NULL) { cout*(pNode-pT)endl; pNode = pNode-pNext; } } ~List() { Node* pNode = pFirst; while(pNode != NULL) { Node* pNextNode = pNode-pNext; delete pNode; pNode = pNextNode; } }protected: struct Node{ Node* pNext; T* pT; Node() { pNext = NULL; pT = new T; } ~Node() { delete pT; } }; Node *pFirst; 链首结点指针};class Student{public: char id[20]; 学号 char name[20]; 姓名 int age; 年龄 Student() { } ~Student() { } Student(const char* pid, const char* pname, int _age) { strcpy(id, pid); strcpy(name, pname); age = _age; } bool operator==(const Student stu) { return strcmp(id, stu.id) == 0 strcmp(id, stu.id) == 0 age==stu.age; } Student operator=(const Student stu) { strcpy(id, stu.id); strcpy(name, stu.name); age = stu.age; } friend ostream operator (ostream out,const Student stu);};ostream operator (ostream out,const Student stu){ out"id:"stu.id"\tname:"stu.name"\tage:"stu.ageendl;}int main(){ ListStudent stuList; cout"添加学生前:"endl; stuList.PrintList(); Student stu1("1", "张三", 18); Student stu2("2", "李四", 18); Student stu3("3", "王五", 18); Student stu4("4", "至尊宝", 18); Student stu5("5", "猪八戒", 18); Student stu6("6", "唐僧", 18); Student stu7("7", "沙和尚", 18); Student stu8("8", "观音", 18); stuList.Add(stu1); stuList.Add(stu2); stuList.Add(stu3); stuList.Add(stu4); stuList.Add(stu5); stuList.Add(stu6); stuList.Add(stu7); stuList.Add(stu8); cout"添加学生后:"endl; stuList.PrintList(); Student stu11("1", "张三", 18); Student* pStu = stuList.Find(stu11); cout"查找到的同学是:"*pStu; stuList.Remove(stu11); cout"\n\n删除第一个后:"endl; stuList.PrintList(); return 0;}
如何用C语言实现一个类似C++中vector的功能
你先学习template,看看Vector是怎么造的,懂得了原理,vector简单的,说穿了就是数组,数组是有大小的,当你要扩大到一定的时候,就会重新分配一个较大的数组,把先前的复制到新的数组中,这个是vector的致命缺陷~当要插入的量大的时候,但优点是访问速度快。
个人博客::blog.csdn./what951006?viewmode=list
C语言如何用if实现一个循环
label if(conditiong)
{
expresstion;
goto label;
}
如何用C语言实现一个类似C++中vectorstring的功能
对于不可以operator overload的c语言来说,string就算实现也是半吊子工程。至于vector,c没有template,所以也不可以。
请教各位大侠如何用C语言或者是C++实现一个对话框
自己实现是不太现实的
需要你自己来处理图形界面 工作量太大。
最简单的 就是用MFC 里面有现成的对话框函数 直接调用就好
也可以用minigui 或者QT一类的图形插件。
如何用C++实现堆排序?不要C语言!
:baike.baidu./view/157305.htm这个网站里面有 你可以看一下
如何用c语言自己实现一个互斥体或临界区
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。 每个进程中访问临界资源的那段代码称为临界区(Critical Section)
如何用c++实现一个lru cache
其实关键不在于用C++还是什么,关于在于算法
一般可以使用一个map和一个双向链表来实现lru
C语言如何用vb界面实现
C做界面用VC++
matlab中imagesc如何用C语言去实现
1.准备好C语言程序,清楚C语言的入口函数
2.编写mexfunction函数。mexfunction函数为C语言与MATLAB语言的接口函数。调用实例在mylinedetect.c文件中.在MATLAB中调用mex指令编译相关文件,将C语言编译为MEX文件。
3.编译完成后,生成mylinedetect.mexw32或mylinedetect.mexw64文件,此文件即mex文件,用于MATLAB与C语言接口函数.
4.编译完成之后,编写MATLAB函数,调用MEX文件。以MEX文件的形式调用编译完成的C语言函数[o1,o2]=mylinedetect(double(X).');......
5.输出结果,上述linedetect函数完成图像中直线检测功能,带入MATLAB中调用后形成结果。
对于C语言中的函数类型,一般可以分为以下两类:
1. 库函数(Library Function):也称为内置函数(Built-in Function),是由C语言提供的、已经封装好的函数。库函数通常具有标准化、通用化的特点,包括数学运算、字符串处理、文件操作等方面。例如`printf()`和`scanf()`是C语言中常用的库函数。
2. 用户自定义函数(User-Defined Function):也称为外置函数(External Function),是程序员根据需求自行编写的函数。用户自定义函数可以将某一段需要重复使用的代码封装成一个函数,在其他地方调用该函数即可实现相同的功能,起到了复用代码的作用。在需要多次执行特定任务时,使用自定义函数可以使程序结构更加清晰、易于理解。
1、createlist不是库函数,一般是数据结构中实现新建一个链表的自定义函数。因此没有什么用法好说的,关键是看自己怎么定义。
2、例程:
NODE *creatlist(int a[])
{ NODE *h,*p,*q;int i;
h=(NODE *)malloc(sizeof(NODE));
h-next=NULL;
for(i=0;iN;i++)
{q=(NODE *)malloc(sizeof(NODE));
q-data=a[i];
q-next=NULL;
if(h-next==NULL) h-next=p=q;
else {p-next=q;p=q;} }
return h;
}
C++ Lists(链表)
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.
assign() 给list赋值
back() 返回最后一个元素
begin() 返回指向第一个元素的迭代器
clear() 删除所有元素
empty() 如果list是空的则返回true
end() 返回末尾的迭代器
erase() 删除一个元素
front() 返回第一个元素
get_allocator() 返回list的配置器
insert() 插入一个元素到list中
max_size() 返回list能容纳的最大元素数量
merge() 合并两个list
pop_back() 删除最后一个元素
pop_front() 删除第一个元素
push_back() 在list的末尾添加一个元素
push_front() 在list的头部添加一个元素
rbegin() 返回指向第一个元素的逆向迭代器
remove() 从list删除元素
remove_if() 按指定条件删除元素
rend() 指向list末尾的逆向迭代器
resize() 改变list的大小
reverse() 把list的元素倒转
size() 返回list中的元素个数
sort() 给list排序
splice() 合并两个list
swap() 交换两个list
unique() 删除list中重复的元素附List用法实例:#include iostream
#include list
#include numeric
#include algorithmusing namespace std;//创建一个list容器的实例LISTINT
typedef listint LISTINT;//创建一个list容器的实例LISTCHAR
typedef listchar LISTCHAR;void main(void)
{
//--------------------------
//用list容器处理整型数据
//--------------------------
//用LISTINT创建一个名为listOne的list对象
LISTINT listOne;
//声明i为迭代器
LISTINT::iterator i; //从前面向listOne容器中添加数据
listOne.push_front (2);
listOne.push_front (1); //从后面向listOne容器中添加数据
listOne.push_back (3);
listOne.push_back (4); //从前向后显示listOne中的数据
cout"listOne.begin()--- listOne.end():"endl;
for (i = listOne.begin(); i != listOne.end(); ++i)
cout *i " ";
cout endl; //从后向后显示listOne中的数据
LISTINT::reverse_iterator ir;
cout"listOne.rbegin()---listOne.rend():"endl;
for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {
cout *ir " ";
}
cout endl; //使用STL的accumulate(累加)算法
int result = accumulate(listOne.begin(), listOne.end(),0);
cout"Sum="resultendl;
cout"------------------"endl; //--------------------------
//用list容器处理字符型数据
//-------------------------- //用LISTCHAR创建一个名为listOne的list对象
LISTCHAR listTwo;
//声明i为迭代器
LISTCHAR::iterator j; //从前面向listTwo容器中添加数据
listTwo.push_front ('A');
listTwo.push_front ('B'); //从后面向listTwo容器中添加数据
listTwo.push_back ('x');
listTwo.push_back ('y'); //从前向后显示listTwo中的数据
cout"listTwo.begin()---listTwo.end():"endl;
for (j = listTwo.begin(); j != listTwo.end(); ++j)
cout char(*j) " ";
cout endl; //使用STL的max_element算法求listTwo中的最大元素并显示
j=max_element(listTwo.begin(),listTwo.end());
cout "The maximum element in listTwo is: "char(*j)endl;
}#include iostream
#include listusing namespace std;
typedef listint INTLIST;//从前向后显示list队列的全部元素
void put_list(INTLIST list, char *name)
{
INTLIST::iterator plist; cout "The contents of " name " : ";
for(plist = list.begin(); plist != list.end(); plist++)
cout *plist " ";
coutendl;
}//测试list容器的功能
void main(void)
{
//list1对象初始为空
INTLIST list1;
//list2对象最初有10个值为6的元素
INTLIST list2(10,6);
//list3对象最初有3个值为6的元素
INTLIST list3(list2.begin(),--list2.end()); //声明一个名为i的双向迭代器
INTLIST::iterator i; //从前向后显示各list对象的元素
put_list(list1,"list1");
put_list(list2,"list2");
put_list(list3,"list3");
//从list1序列后面添加两个元素
list1.push_back(2);
list1.push_back(4);
cout"list1.push_back(2) and list1.push_back(4):"endl;
put_list(list1,"list1");//从list1序列前面添加两个元素
list1.push_front(5);
list1.push_front(7);
cout"list1.push_front(5) and list1.push_front(7):"endl;
put_list(list1,"list1");//在list1序列中间插入数据
list1.insert(++list1.begin(),3,9);
cout"list1.insert(list1.begin()+1,3,9):"endl;
put_list(list1,"list1");//测试引用类函数
cout"list1.front()="list1.front()endl;
cout"list1.back()="list1.back()endl;//从list1序列的前后各移去一个元素
list1.pop_front();
list1.pop_back();
cout"list1.pop_front() and list1.pop_back():"endl;
put_list(list1,"list1");//清除list1中的第2个元素
list1.erase(++list1.begin());
cout"list1.erase(++list1.begin()):"endl;
put_list(list1,"list1");//对list2赋值并显示
list2.assign(8,1);
cout"list2.assign(8,1):"endl;
put_list(list2,"list2");//显示序列的状态信息
cout"list1.max_size(): "list1.max_size()endl;
cout"list1.size(): "list1.size()endl;
cout"list1.empty(): "list1.empty()endl;//list序列容器的运算
put_list(list1,"list1");
put_list(list3,"list3");
cout"list1list3: "(list1list3)endl;
cout"list1list3: "(list1list3)endl;//对list1容器排序
list1.sort();
put_list(list1,"list1");
//结合处理
list1.splice(++list1.begin(), list3);
put_list(list1,"list1");
put_list(list3,"list3");
}补充:STL标准函数find进行vector 、list链表查找#include vector
#include algorithm
#include iostreamclass example
{
public:
example(int val)
{
i = val;
}bool operator==(example const rhs)
{
return (i == rhs.i) ? true : false;
}private:
int i;
};
using namespace std;
int main(void)
{
vectorexample ve;
ve.push_back(1);
vectorexample::iterator it;
example elem(1);
it = find(ve.begin(), ve.end(), elem);
coutboolalpha(*it == elem);
}
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流