这里有一道C语言问题,有大神帮忙解答一下吗?
展开全部
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//L为带头结点的单链表的头指针
bool GetElem_L(LinkList L,int i,int &e)
{
if(i<0) return false;
LinkList p;
p=L; //将P指向头结点
while(p&&i)
{
p=p->next;
i--;
}
if(!p||i<0)
return false;
e=p->data;
return true;
}
/*
bool ListDelete_L(LinkList L,int i,int &e)
{
int num=1;
while(i!=num)
{
L=L->next;
num++;
}
if(!(L->next)) return false;
LinkList q=L->next;
e=q->data;
L->next=q->next;
free(q);
return true;
}
*/
void Free(LinkList node,int temp,int &e)
{
int num=1;
while(temp!=num)
{
node=node->next;
num++;
}
e=node->next->data;
// LinkList p=node->next;
node->next=node->next->next;
// free(p);
}
LinkList CreateList_L(int n) //插入n个元素
{
LinkList head;
head=(LinkList)malloc(sizeof(LNode));
if(head==NULL)
{
cout<<"头结点分配失败"<<endl;
exit(0);
}
head->next=NULL;
LinkList temp=head;
for(int i=0;i<n;i++)
{
int num;
cin>>num;
LinkList p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
{
cout<<"结点内存分配失败"<<endl;
exit(0);
}
p->data=num;
temp->next=p;
temp=p; //使temp指向新的结点
}
return head; //返回头结点
}
//尾插法
void InsertOfTail(LinkList node,int temp)
{
while(node->next!=NULL)//判断条件是node->next!=NULL;指向最后一个结点就停止
{
node=node->next;
}
LinkList New=(LinkList)malloc(sizeof(LNode));
if(New==NULL)
{
cout<<"节点内存分配失败!";
exit(0);
}
New->data=temp;
node->next=New;
}
int LENGTH(LinkList node)
{
node=node->next;
int count=0;
while(node!=NULL)
{
node=node->next;
count++;
}
return count;
}
//遍历单链表
void Printf(LinkList node)
{
node=node->next;//头节点需要跳过
while(node!=NULL)
{
cout<<node->data<<" ";
node=node->next;
}
cout<<endl;
}
void DestroyList(LinkList head)
{
LinkList p;
while(head->next!=NULL)
{
p=head;
head=head->next;
free(p);
}
free(head);
}
int main()
{
LNode* L=CreateList_L(3);
Printf(L);
int a;
GetElem_L(L,2,a);
cout<<a<<endl;
int b;
Free(L,1,b);
cout<<b<<endl;
InsertOfTail(L,99);
// InsertOfTail(L,355);
Printf(L);
return 0;
}
链表的功能都实现了,你可以直接去其中找增加和输出的功能。找的过程顺便可以锻炼一下你的代码能力
#include<stdlib.h>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
//L为带头结点的单链表的头指针
bool GetElem_L(LinkList L,int i,int &e)
{
if(i<0) return false;
LinkList p;
p=L; //将P指向头结点
while(p&&i)
{
p=p->next;
i--;
}
if(!p||i<0)
return false;
e=p->data;
return true;
}
/*
bool ListDelete_L(LinkList L,int i,int &e)
{
int num=1;
while(i!=num)
{
L=L->next;
num++;
}
if(!(L->next)) return false;
LinkList q=L->next;
e=q->data;
L->next=q->next;
free(q);
return true;
}
*/
void Free(LinkList node,int temp,int &e)
{
int num=1;
while(temp!=num)
{
node=node->next;
num++;
}
e=node->next->data;
// LinkList p=node->next;
node->next=node->next->next;
// free(p);
}
LinkList CreateList_L(int n) //插入n个元素
{
LinkList head;
head=(LinkList)malloc(sizeof(LNode));
if(head==NULL)
{
cout<<"头结点分配失败"<<endl;
exit(0);
}
head->next=NULL;
LinkList temp=head;
for(int i=0;i<n;i++)
{
int num;
cin>>num;
LinkList p=(LinkList)malloc(sizeof(LNode));
if(p==NULL)
{
cout<<"结点内存分配失败"<<endl;
exit(0);
}
p->data=num;
temp->next=p;
temp=p; //使temp指向新的结点
}
return head; //返回头结点
}
//尾插法
void InsertOfTail(LinkList node,int temp)
{
while(node->next!=NULL)//判断条件是node->next!=NULL;指向最后一个结点就停止
{
node=node->next;
}
LinkList New=(LinkList)malloc(sizeof(LNode));
if(New==NULL)
{
cout<<"节点内存分配失败!";
exit(0);
}
New->data=temp;
node->next=New;
}
int LENGTH(LinkList node)
{
node=node->next;
int count=0;
while(node!=NULL)
{
node=node->next;
count++;
}
return count;
}
//遍历单链表
void Printf(LinkList node)
{
node=node->next;//头节点需要跳过
while(node!=NULL)
{
cout<<node->data<<" ";
node=node->next;
}
cout<<endl;
}
void DestroyList(LinkList head)
{
LinkList p;
while(head->next!=NULL)
{
p=head;
head=head->next;
free(p);
}
free(head);
}
int main()
{
LNode* L=CreateList_L(3);
Printf(L);
int a;
GetElem_L(L,2,a);
cout<<a<<endl;
int b;
Free(L,1,b);
cout<<b<<endl;
InsertOfTail(L,99);
// InsertOfTail(L,355);
Printf(L);
return 0;
}
链表的功能都实现了,你可以直接去其中找增加和输出的功能。找的过程顺便可以锻炼一下你的代码能力
追问
谢谢
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询