如何用C语言或C++实现一个List类?

请帮忙一下

    C语言没有类的概念。C++有现成的List类, #include<list>即可。

    如果要自己实现可以参考C++数据结构的书籍,是最基本的练习。

    这里实现一个简单的例程,请参考:

    #include <iostream>
    #include <fstream>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    #include<stdio.h>
    #include<string>
     
    #include "math.h"
     
    template<class 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.age<<endl;
    }
     
    int main()
    {
        List<Student> 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;
    }

温馨提示:内容为网友见解,仅供参考
第1个回答  2008-03-27
C++本身就有一个List容器对象啊本回答被提问者采纳
第2个回答  2008-03-27
c语言没有类.如果一定要用函数指针来模拟class的行为最后的代码看起来有点奇怪
c++有现成的 #include<list>即可

需要手写的话随便找一本数据结构的书 都有现成的吧
c风格的写法是定义一个node struct 然后用一堆全局函数来操控
struct node
{
int ele;
node* next;
};
insert(node* list,int x);
getatlocation(node* list,int x);
等等
c++风格的写法通常会使用template
template<typename Node> class LinkedList
{
private:
int SizeOfList; // Number of nodes in the LinkedList object
Node* Head; //
public:
LinkedList();
LinkedList(int n);
~LinkedList();
int insert(const Node& value);
}
等等..
第3个回答  2008-03-27
//头文件:LinkList.h

typedef struct LNode {
int data;
struct LNode *next;
}LNode, *pLinkList;

class LinkList {
private:
pLinkList m_pList;
int m_listLength;
public:
LinkList();
~LinkList();
bool InitList ();
bool DestroyList ();
bool ClearList();
bool IsEmpty ();
int GetLength ();
bool GetNode(int position, LNode** node);
int LocateElem(int elem);
bool SetNodeData(int position, int newData);
bool GetNodeData(int position, int &data);
bool InsertNode(int beforeWhich, int data);
bool DeleteNode(int position);
};

//Cpp文件:LinkList.cpp

#include <iostream.h>
#include "LinkList.h"

LinkList::LinkList() {
m_pList = NULL;
m_listLength = 0;

InitList();
}

LinkList::~LinkList() {
if (!DestroyList()) {
DestroyList();
}
}

//初始化,分配一个头节点。
bool LinkList::InitList() {
if (!(m_pList = new LNode)) {
return false;
}
m_pList->next = NULL;

return true;
}

//销毁链表。
bool LinkList::DestroyList() {
if (!ClearList()) {
return false;
}

delete m_pList;

return true;
}

//判断链表是否为空。若为空,返回true,否则返回false。
bool LinkList::IsEmpty() {
if (m_pList->next == NULL) {
return true;
}
return false;
}

//返回链表的中当前节点数。
int LinkList::GetLength() {
return m_listLength;
}

//将链表清空,释放当前所有节点。
bool LinkList::ClearList() {
if (m_pList == NULL) {
return false;
}

LNode *pTemp = NULL;
while (m_pList->next != NULL) {
pTemp = m_pList->next;
m_pList->next = pTemp->next;
delete pTemp;
}
m_listLength = 0;

return true;
}

//将position指定的节点内的数据设置为newData。
//第一个有效节点的position为1。
bool LinkList::SetNodeData(int position, int newData) {
LNode *pTemp = NULL;

if (!(GetNode(position, &pTemp))) {
return false;
}

pTemp->data = newData;

return true;
}

//得到指定位置节点的数据。
//节点索引从1到listLength。
bool LinkList::GetNodeData(int position, int &data) {
LNode *pTemp = NULL;

if (!(GetNode(position, &pTemp))) {
return false;
}

data = pTemp->data;

return true;
}

//在链表中插入一个节点。
//插入的位置由beforeWhich指定,新节点插入在beforeWhich之前。
//beforeWhich的取值在1到ListLength+1之间。
bool LinkList::InsertNode(int beforeWhich, int data) {
LNode *pTemp = NULL;

if (beforeWhich < 1 || beforeWhich > (m_listLength + 1)) {
return false;
}

if (!(GetNode(beforeWhich - 1, &pTemp))) {
return false;
}

LNode *newNode = new LNode;
newNode->data = data;
newNode->next = pTemp->next;
pTemp->next = newNode;

m_listLength++;

return true;
}

//删除一个指定的节点。
//节点位置由position指定。
//positon的值从1到listLength。
//若链表为空或指定的节点不存在则返回false。
bool LinkList::DeleteNode(int position) {
if (position < 1 || position > m_listLength) {
return false;
}

LNode *pTemp = NULL;
if (!(GetNode(position - 1, &pTemp))) {
return false;
}

LNode *pDel = NULL;
pDel = pTemp->next;
pTemp->next = pDel->next;
delete pDel;

m_listLength--;

return true;
}

//得到指定位置节点的指针。
bool LinkList::GetNode(int position, LNode **node) {
LNode *pTemp = NULL;
int curPos = -1;

pTemp = m_pList;
while (pTemp != NULL) {
curPos++;
if (curPos == position)
break;
pTemp = pTemp->next;
}

if (curPos != position) {
return false;
}

*node = pTemp;

return true;
}

//定位与指定数据相等的数据节点。
//如果在当前链表中已经存在该数据则返回该数据节点的索引号。
//若不存在这样的节点则返回0。
//节点索引从0开始到listLength。
int LinkList::LocateElem(int elem) {
LNode *pTemp = NULL;
int curIndex = 1;

pTemp = m_pList->next;
while ((pTemp != NULL) && (pTemp->data != elem)) {
pTemp = pTemp->next;
curIndex++;
}

if (pTemp == NULL) {
return 0;
}

return curIndex;
}

/*
int main(){
LinkList l;

l.InsertNode(1, 10);
l.InsertNode(2, 20);
l.InsertNode(3, 30);
l.InsertNode(4, 40);
cout << l.GetLength() << endl;

int dataTemp = 0;
for (int i = 1; i <= l.GetLength(); i++) {
l.GetNodeData(i, dataTemp);
cout << dataTemp << endl;
}

if (l.SetNodeData(3, 50)) {
cout <<"DONE\n";
} else {
cout << "Failed\n";
}

for (i = 1; i <= l.GetLength(); i++) {
l.GetNodeData(i, dataTemp);
cout << dataTemp << endl;
}

if (l.DeleteNode(4)) {
cout <<"DONE\n";
} else {
cout << "Failed\n";
}

for (i = 1; i <= l.GetLength(); i++) {
l.GetNodeData(i, dataTemp);
cout << dataTemp << endl;
}

cout << l.LocateElem(50) << endl;
return 0;
}

c\/c++ 可变参数使用方法和原理
C\/C++中,可变参数函数的实现依赖于不同的头文件:C语言通过stdarg.h,而C++则通过std::stdarg。理解其使用方法和原理有助于编写更灵活的函数调用。首先,使用va_list数据类型来声明参数列表,它是一个指向参数集合的指针,用于后续的处理。接着,va_start宏是关键步骤,它需要一个va_list变量和最后一...

C语言这种结构体如何构造一个空的线性表L
函数main()里的语句 LinkList L; 系统自动给变量L分配了内存,L对应的是第2个结构体,也就是LinkList.调用初始化函数InitList(),给变量L里的成员head,tail,len进行赋值,L.head指向的就是空链表,此时,L.head=NULL,同时,L.len=0,表示没有结点.所以执行函数InitList()之后,也就制造了空链表.执行...

用惯了C语言现在用C++怎样才能合理的抽象出一个类呀?怎样用继承?好不习...
第一,个人认为c++中的类和c中的结构体差别仅仅在于其中定义的变量和函数有其他属性,而结构体全部是public;第二,如何合理抽象一个类,其实和建立结构体一样。关键要划分好属性。第三,那么如何抽象出一个类呢?比如你定义人这个类,就把人的共同属性列出来。而不要把学生的属性加进去。定义学生类...

要用c语言或是VC++实现一个高频的单词统计算法
Description: 文件中指定单词个数的统计 Version: 1.0 Function List:1. TransformFile() \/\/ 将文件转换为有效的格式 2. CountWord() \/\/ 单词计数 3. IsValidChar() \/\/ 检查是否有效的英语字母 4. GetInput() \/\/ 从输入流读取数据 5. UpperCase() \/\/ 字符强制转换为...

C语言(最好C++)编一下这个程序
若女利用Fp链接进以 printf("Pls enter the information of teacher:\\n注意中间一空格间隔,性别只可为大写的F或M,Ex:张三 187 M\\n");for (int i = 0; i < n; i++){ cin >> teacher->name >> teacher->weight >> teacher->sex;if (teacher->sex == 'M')...

initlist函数用c语言怎么写
include<stdio.h> voidAddNumOne(intnum){ num+=5;} voidAddNumTwo(int*num){ num+=5;} intmain(){ intnum=0;\/\/这里和定义链表是一样的 AddNumOne(num);printf("%-5d\\r\\n",num);AddNumTwo(&num);printf("%-5d\\r\\n",num);return0;} ...

C语言能实现C++语言能实现的所有功能吗
C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(...

一个程序能同时使用C++和C语言吗?
能,C++全面兼容C的,但是编译的时候就要用C++编译器了,毕竟C不可能兼容C++的... vc6.0是可以的,凡是纯C写的vc6.0都能运行..

用C语言或者c++计算Josephus问题
从Start开始,没报一个数就向一个结点行动,直到第M个结点,输出数据并删除结点;当第N-1个数输出完毕,跳出循环,并输出最后剩下的结点中的元素。?\/ void Find_delete(){ int i, j, k = 0, num = N;LinkList pre = L, s;while (num > 1) { for(i = 1; i < M; i++) { ...

如何用C++实现一个整数类的集合??
这个东西还是用2叉树做吧,链表查找太慢,这是我今天写的,刚好昨天看完了2叉树,所以写了个,试试看,有问题请留言,如果你实在要用链表实现的话我也可以给你写个:include<iostream> include<cstddef> include<sstream> usingnamespacestd;\/\/predeclarationisneededforclassBTFolk template<classT> c...

相似回答