C语言问题:建立一个有三个结点的链表,然后输出每个结点的数据。

要求:
建立一个有三个结点的链表,然后输出每个结点的数据。要求每个结点有三个成员:num(char),score(int),next(指针)
请各位高手帮忙啊!
为什么都那么复杂啊,看着就头晕了……

//class CLinkList

#include "CLinkList.h"
#include "CNode.h"

CLinkList::CLinkList()
{
cout << "这个是构造函数"<< endl;

m_Head = &m_Node; //链表的头指针指向头结点
m_Node.SetNodeData(0, 0); //给头结点的内容赋0值
m_Node.SetNodeNext(NULL); //将头结点的Next指针设置为NULL;
}

CLinkList::~CLinkList()
{
cout << "这个是析构函数" << endl;
}

void CLinkList::CreateList() //以向后追加的方式创建一个链表,输入0退出
{
int nScore = 0; //定义一个临时的整形变量来保存数据
char chNum = 0; //定义一个临时的字符型变量来保存数据

cout << "欢迎来创建链表 !" << endl;
CNode * pTemp = NULL; //定义一个临时结点指针,用来增加新结点用
CNode * pNode = m_Head; //定义一个标记指针,首先叫其指向头结点

while(1)
{
pTemp = new LinkNode;

cout << "请输入下一个结点的内容!" << endl;
cin >> nScore; //输入0退出
cin >> chNum;
if ('0' == nScore)
{
break;
}

pTemp->SetNodeData(nScore, chNum); //给新结点的内容赋值
pNode->SetNodeNext(pTemp); //让链尾的Next指向新建的结点
pNode = pTemp; //将结尾元素向后移
}
cout << "创建链表结束" << endl;
}

LinkNode* CLinkList::GetListNode(int _nIndex)
{
cout << "这个是按位置查找指定位结点的成员函数" << endl;

LinkNode* pNode = m_Head->GetNodeNext(); //定义一个临时的结点指针,初始化指向头结点
int Temp = 0; //定义一个临时的变量,用来标记已检查结点的个数的

if(-1 == _nIndex) //返回头结点(即头指针)
{
return m_Head;
}

if(_nIndex < -1) //_nIndex控制条件
{
cout << "您输入的是错误的位置!" << endl;
return 0;
}

while(pNode != NULL)
{
if(_nIndex == Temp)
{
return pNode;
}
pNode = pNode->GetNodeNext(); //临时结点向后移动
++Temp;
}

return pNode; //没找到结点就返回NULL

}

void CLinkList::InsertList(int _nIndex, int _nScore, char _chNum) //插入结点的函数成员
{
cout << "这个是插入结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要插入位置的前一指针

LinkNode* pTemp = new CNode; //定义一个临时结点指针,用来增加新结点用

pTemp->SetNodeData(_nScore, _chNum); //设置插入结点的内容

pTemp->SetNodeNext(pNode->GetNodeNext());
pNode->SetNodeNext(pTemp);
}

void CLinkList::DeleteList(int _nIndex)
{
cout << "这个是删除某一结点的成员函数" << endl;

LinkNode* pNode = GetListNode(_nIndex - 1); //定义一个结点类的指针,指向的是要删除位置的前一指针
LinkNode* pTemp = NULL; //定义一个临时结点指针,用来指向要删除的结点

pTemp =pNode->GetNodeNext(); //把pTemp指向要删除的结点

pNode->SetNodeNext(pTemp->GetNodeNext()); //把pNode指向要删除的结点的后一个结点

delete pTemp; //删除结点
pTemp = NULL;
}

LinkNode* CLinkList::GetHeadList()
{
cout << "这个是获取头指针的成员函数" << endl;

return m_Head;
}

void CLinkList::SetListData(int _nIndex, int _nScore, char _chNum)
{
cout << "这个是设置链表中某一结点的值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要修改内容位置的结点

pNode->SetNodeData(_nScore, _chNum); //修改内容

}

void CLinkList::ShowListData(int _nIndex)
{
cout << "这个是显示链表中某一结点值的成员函数" << endl;

CNode *pNode = GetListNode(_nIndex); //定义一个结点类的指针,指向的是要获取内容位置的结点

pNode->ShowNodeData(); //返回想要得到位置的结点内容
}

void CLinkList::DestroyList(int _nIndex)
{
cout << "这个是销毁某一位置以后链表的成员函数" << endl;

LinkNode* pTemp = GetListNode(_nIndex - 1); //定义一个结点指针,指向要销毁位置的前一结点
LinkNode* pNode = pTemp->GetNodeNext(); //定义一个结点指针,指向要销毁位置的结点

while(pTemp->GetNodeNext() != NULL) //销毁动作的结束条件或初始条件
{
pTemp->SetNodeNext(pNode->GetNodeNext()); //把需要销毁的位置的前结点的Next指向销毁位置的下一个结点
delete pNode; //销毁结点

pNode = pTemp->GetNodeNext(); //把pNode重新指向要销毁位置的结点
}
}

void CLinkList::ShowList()
{
cout << "这个是显示链表的成员函数" << endl;

int nTemp = 0; //定义一个临时的整形变量用来控制输入的个数

LinkNode* pTemp = m_Head->GetNodeNext(); //定义一个结点类指针,指向第0位的结点
if(NULL == pTemp)
{
cout << "这是个空链" << endl;
}

while(pTemp != NULL)
{
pTemp->ShowNodeData();

++nTemp;
if(0 == nTemp % 5 && nTemp != 0) //控制每行只能输出5个结点的内容
{
cout << endl;
}

pTemp = pTemp->GetNodeNext();
}
}
//class CNode
#include "CNode.h"

CNode::CNode()
{

int m_nScore = 0;
char m_chNum = 0;
m_Next = NULL;
}

CNode::~CNode()
{
}

void CNode::SetNodeData(int _nScore, char _chNum)
{
m_nScore = _nScore;
m_chNum = _chNum;
}

void CNode::ShowNodeData()
{
cout << m_nScore << '\t' << m_chNum << endl;
}

void CNode::SetNodeNext(CNode* _Next)
{
m_Next = _Next;
}

CNode* CNode::GetNodeNext()
{
return m_Next;
}
#include "CLinkList.h"
#include "CNode.h"

void Text(); //测试函数声明

int main()
{
cout << "这是mian函数" << endl;
Text();
return 0;
}

void Text()
{
cout << "这个是测试函数" << endl;

LinkList* pList = new LinkList; //创建一个内存链表对象

cout << "------------------CreateList-----------------------------" << endl;
pList->CreateList(); //初始化链表的函数成员
pList->ShowList();
cout << endl;

cout << "------------------GetListNode-----------------------------" << endl;
LinkNode* pNode = NULL; //定义一个临时的结点类指针用于检测查找函数成员
pNode = pList->GetListNode(3); //按位置查找指定位结点的成员函数的测试

if(pNode)
{
cout << "用按位置查找的方法找到了指定位结点" << endl;
}
else
{
cout << "对不起,用按位置查找的方没有找到指定位结点" << endl;
}
cout << endl;

cout << "------------------InsertList-----------------------------" << endl;
pList->InsertList(0, 9, 'x'); //插入结点的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------DeleteList-----------------------------" << endl;
pList->DeleteList(0); //删除某一结点的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;
pNode = NULL;
pNode = pList->GetHeadList(); //获取头指针的成员函数的测试
if(pNode)
{
cout << "已经返回了头指针" << endl;
}
else
{
cout << "对不起,头指针为空" << endl;
}
cout << endl;

cout << "------------------GetHeadList-----------------------------" << endl;
pList->SetListData(3, 7 , '@'); //设置链表中某一结点的值的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------GetListData-----------------------------" << endl;
cout << "pList->ShowListData(3) =";
pList->ShowListData(3); //获取链中某一结点值的成员函数的测试
cout << endl;

cout << "------------------DestroyList(3)-----------------------------" << endl;
pList->DestroyList(3); //销毁第3位置以后链表的成员函数的测试
pList->ShowList();
cout << endl;

cout << "------------------DestroyList(0)-----------------------------" << endl;
pList->DestroyList(0); //销毁第0位置以后链表的成员函数的测试
pList->ShowList();
cout << endl;

delete pList; //释放内存
pList = NULL; //指针置空

}

这个是按照我以前写的链表改写的 , 应该有些功能你用不到 , 可以删掉的 , 基本上都有注释的,自己看着改,,后面的很多都是测试程序, 自己看那个不想要也可以删掉
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-04
//---------------------------------------------------------------------------

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
typedef struct node{
char num;
int score;
struct node *next;
} node;
node *create(int n) /*创建有n个结点的单链表*/
{
node *rt=NULL;
node *now;
node *nt=NULL;
int i;
srand(time(NULL));
for (i = 0,rt=now=malloc(sizeof(node)); i<n; i++) {
if (i) {
nt=malloc(sizeof(node));
nt->next=NULL;
nt->num=rand()%26+'a'; /*对数据域值,此处采用随机数赋值,可以改为从键盘输入*/
nt->score=rand()%101; /*对数据域值,此处采用随机数赋值,可以改为从键盘输入*/
now->next=nt;
now=now->next ;
}
else{
now->num=rand()%26+'a'; /*对数据域值,此处采用随机数赋值,可以改为从键盘输入*/
now->score=rand()%101; /*对数据域值,此处采用随机数赋值,可以改为从键盘输入*/
now->next=NULL;
}

}
return rt;
}

void prt(node *a) /*输出单链表*/
{
while (a)
{
printf("NUM:\t\t%c\nSCORE:\t\t%d\n\n",a->num,a->score);
a=a->next;
}
}

void nfree(node *a) /*释放空间*/
{
node *b;
while (a)
{
b=a->next;
free(a);
a=b;
}
}
int main(void)
{
node *na=create(3); /*调用create()创建包含3个结点的单链表*/
prt(na);
nfree(na);
return 0;
}
//---------------------------------------------------------------------------本回答被提问者采纳
第2个回答  2018-02-28
#include<stdio.h>
#include<stdlib.h>
//链表结构类型 
typedef struct Node{
 char num;
 int score;
 Node* next;
}*List;
int main(){
 List L;
 //创建三个结点 
 Node* l1=(Node*)malloc(sizeof(Node));
 Node* l2=(Node*)malloc(sizeof(Node));
 Node* l3=(Node*)malloc(sizeof(Node));
 //修改三个结点信息
 l1->num='1';
 l1->score=100;
 l2->num='2';
 l2->score=85;
 l3->num='3';
 l3->score=60;
 //连接关系
 L=l1;
 l1->next=l2;
 l2->next=l3;
 l3->next=NULL; 
 //循环输出链表信息
 Node* p=L;
 while(p!=NULL){
  printf("num:%c\n",p->num);
  printf("score:%d\n\n",p->score);
  p=p->next;
 }
 //删除链表
 free(l1);
 free(l2);
 free(l3);
 return 0;
}

第3个回答  2016-02-03
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#define MY_MALLOC_TYPEDEF(td) (td *)calloc(1, sizeof(td))

//定义一个结构体
typedef struct node
{
    int age;
    char name[64];
    struct node *next;
}STU;

STU *head, *tail;

STU *createEntry(int age, char *name)
{
    STU *entry;

    entry = MY_MALLOC_TYPEDEF(STU);
    if(NULL == entry)
    {
        return NULL;
    }
    entry->age = age;
    strcpy(entry->name, name);
    //尾插法
    if(NULL == head)
    {
        head = tail = entry;
        return entry;
    }
    tail->next = entry;
    tail = tail->next;
    return entry;
}

void showList(STU *list)
{
    if(NULL == list)
    {
        printf("List is empty!\n");
        return;
    }
    while(list)
    {
        printf("%s/%d ", list->name, list->age);
        list = list->next;
    }
    printf("\n");
}

int main(int argc, char **argv)
{
    STU *p, *q, *t;

    //创建3个节点
    q = createEntry(18, "persona");
    p = createEntry(19, "personb");
    t = createEntry(20, "personc");

    showList(head);

    return 0;
}

第4个回答  2009-12-14
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student //定义一个结构体student
{
char num[10];
int score;
struct student *next;//指向下个结点的指针
};
struct student *head;//定义一个链表头指针
void main()
{
int i;
struct student *p;
for(i=1;i<4;i++)
{
p=(struct student *)malloc(LEN);
printf("\n请输入学号和成绩:");
scanf("%s%d",p->num,&(p->score));
if(i==1)
{
head=p;
head->next=NULL;
}
else if(i==2)
{
head->next=p;
p->next=NULL;
}
else
{
(head->next)->next=p;
p->next=NULL;
}
}
p=head;
while(p!=NULL)
{
printf("\n%10s%5d\n",p->num,p->score);//输出当前结点
p=p->next;//p指向下个结点
}
}
相似回答