
void print(List L)
{
while(L->next)
{ printf("%d",L->key);
L = L->next;
}
}
#include <stdioh>
#include <stdlibh>
#include <malloch>
typedef int Elemtype;
typedef struct Lnode{
Elemtype data;
struct Lnode next;
}Lnode, Linklist;
Linklist linklist_creat()
{
Linklist head,p1,p2;
Elemtype n=1;
head=(Linklist)malloc(sizeof(Lnode));
p2=0;
p1=0;
while (n<=30)//建立一个无头节点的单链循环链表,共30个节点,每个节点的data域依次为1-30
{
if (n==1)
{
p1=head;
p1->data=1;
p1->next=head;
p2=p1;
}
else
{
p1=(Linklist)malloc(sizeof(Lnode));//先申请内存,获取分配的内存首地址后赋值给p1
p2->next=p1;
p2=p1;
p1->data=n;
}
n++;
}
p1->next=head;
return head;
}
void link_print(Linklist head)//输出整个链表中的每个节点的data域
{
int n;
Linklist p;
p=head;
n=1;
for(;n<=30;p=p->next)//n<=30
{
printf("%d,",p->data);
n++;
}
}
void main()
{
Linklist head=linklist_creat();
link_print(head);
}
#include <iostream,h>
#include <stringh>
struct Node
{
int num ;
Node next ;
};
Node Create() //链表创建
{
int n=0;
Node p1,p2,head;
p1=p2=new Node;
cin>>p1->num;
head=NULL;
while (p1->num!=0)
{
if (n==1)
{
head=p1;
}
else p2->next=p1;
p2=p1;
p1=new Node;
cin>>p1->num;
n++;
}
p2->next=NULL;
return head;
}
int ListLength(Node L) //链表的计数
{
Node p=L;
int count=0;
while(p->next)
{
count++;
p=p->next;
}
return count;
}
int Search(Node &L , int value) //链表的查找
{
Node p=L;
int index=0;
while(p)
{
if(p->num== value)
return index;
p=p->next;
index++;
}
return 0;
}
void Print(Node head) //输出链表
{
Node p=head;
while (p)
{
cout<<p->num<<" ";
p=p->next;
}
cout<<endl;
}
void Destruct(Node head) //清空链表
{
Node current = head, temp = NULL;
while (current)
{
temp = current;
current = current ->next;
delete temp;
}
}
Node ReverseList(Node head) //链表逆序(循环方法)
{
Node p,q,r;
p=head; //一开始p指向第一个节点
q=p->next; //q指向第二个节点
while (q!=NULL) //如果没到链尾
{ //以第一次循环为例
r=q->next; //r暂时存储第三个节点
q->next=p; //没执行此句前,q->next指向第三个节点
//执行之后,q->next指向第一个节点p
p=q; //之后p指向第二个节点
q=r; //q指向第三个节点
//即p=>q=>r变为 p<=q<=r
}
head->next=NULL; //最后原来的链头变为链尾,把它指向NULL。
head=p; //原来的链尾变成链头
return head;
}
//已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(循环方法)
//(保留所有结点,即便大小相同)
Node Merge(Node head1 , Node head2)
{
if ( head1 == NULL)
return head2 ;
if ( head2 == NULL)
return head1 ;
if ( head1->num < =head2->num )
{
head = head1 ;
head1= head1->next;
}
else
{
head = head2 ;
head2 = head2->next ;
}
Node temp = head ;
while ( head1 != NULL && head2 != NULL)
{
if ( head1->num <= head2->num )
{
temp->next = head1 ;
head1 = head1->next ;
temp =temp->next;
}
else
{
temp->next = head2;
head2 = head2->next ;
temp =temp->next;
}
}
if (head1 == NULL)
temp->next = head2;
if (head2 == NULL)
temp->next = head1;
return head;
}
//已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序。(递归方法) Node MergeRecursive(Node head1 , Node head2)
{
if ( head1 == NULL )
return head2 ;
if ( head2 == NULL)
return head1 ;
Node head = NULL ;
if ( head1->num < head2->num )
{
head = head1 ;
head->next = MergeRecursive(head1->next,head2);
}
else
{
head = head2 ;
head->next = MergeRecursive(head1,head2->next);
}
return head ;
}
Node Delete(Node head , int num) //删除节点
{
if (head==NULL)
{
cout<<"List is Null"<<endl; return head;
}
Node p1,p2;
p1=head;
while (p1->num!=num && p1->next)
{
p2=p1;
p1=p1->next;
}
if (p1->num==num)
{
if (p1==head)
{
head=p1->next;
}
else p2->next=p1->next;
}
else cout<<"Do not Find The Num "<<num<<endl;
return head;
}
Node Insert(Node head , int num) //插入节点
{
Node p0,p1,p2;
p1=head;
p0=new Node;
p0->num=num;
if (head==NULL)
{
head=p0;
p0->next=NULL;
return head;
}
while (p1->num<p0->num && p1->next)
{
p2=p1; p1=p1->next;
}
if (p1->num>=p0->num)
{
if (p1==head)
head=p0;
else p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
return head;
}
void main()
{
main函数里面自己调用可以吗?
你可以测试下那些函数,好好学吧!
}
扣着的是头节点(头子)
车是首节点(首子)
马是次节点(次子)
牙签细的是指针指向,香头发黑的是指向,铁头细的是指向。
根据步骤写程序的伪算法(3步4循环,7张搞定),如下:
以下是while循环(条件:香头指向不为空)
第一个循环把马弄到车前面,
第二个循环把相弄到马前面
第三个循环把士弄到相前面
直到香指向为空后停止循环。
代码如下:只需要一个首结点pHead,就能把链表找到,并倒置。具体代码如下
p香=pHead->pNext;
p铁=p香->pNext;
p香->pNext=NULL;
P香=p铁
while(p香 !=NULL)
{
p铁=p香->pNext;
p香->pNext=pHead->pNext;
pHead->pNext=p香;
p香=p铁;
}
对照伪算法(三步四循环),和上面的代码是一一对应的:
第一步:香头指向首子,铁头指向次子
第二步:删掉首子指向次子(铁头所指向的那个子)的牙签
第三步:香头跟着铁头
以下循环条件:(条件:香头指向不为空)
{
循环1:铁头移动到香头的下一个指向
循环2:香头的下一个指向首子
循环3:头子的下一个跟着香头
循环4:香头跟着铁头
}
自己用道具 *** 作几遍,然后把流程背会,以后自己根据流程写代码即可。
struct node headp=NULL;
你的headp值为空,那么在creat(int)中,
struct node search=headp,newnode;
search的值也为空,因此在接下来的for循环中,
第一次执行search->next=newnode;时就是访问无效内存了。
# include <stdioh>
# include <stdlibh>
typedef struct Node
{
int data;
struct Node pNext;
} NODE, PNODE;
PNODE creat_node();
void disp_node(PNODE);
bool insert_node(PNODE, int, int);
bool delete_node(PNODE, int, int);
bool find_node(PNODE, int, int);
bool empty_node(PNODE);
bool inversion_node(PNODE);
int main (void)//主函数
{
int vale;
PNODE pHead;
pHead = creat_node();
disp_node(pHead);
insert_node(pHead, 4, 10);//在第四个节点位置插入值为10的节点
disp_node(pHead);
delete_node(pHead, 3, &vale);//删除第三个节点
disp_node(pHead);
find_node(pHead, 5, &vale);
inversion_node(pHead);
return 0;
}
PNODE creat_node()//按要求建立单链表的
{
int i;
int num;
PNODE pHead;
pHead = (PNODE)malloc(sizeof(NODE));
if(pHead == NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
PNODE pTail;
pTail = pHead;
pTail->pNext = NULL;
PNODE pNew;
printf("请输入你要创建链表元素的个数:");
scanf("%d", &num);
for(i = 0; i < num; ++i)
{
pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
printf("请给第%d个链表元素赋值:", i+1);
scanf("%d", &pNew->data);
pTail->pNext = pNew;
pNew->pNext = NULL;
pTail = pNew;
}
printf("\n\n");
return pHead;
}
void disp_node(PNODE pHead)//显示每个节点的内容
{
PNODE p;
p = pHead;
while(p->pNext != NULL)
{
p = p->pNext;
printf("%4d", p->data);
}
printf("\n");
return;
}
bool insert_node(PNODE pHead, int pos, int vale)//插入节点
{
PNODE p;
p = pHead;
int i = 0;
while(p != NULL && i < pos-1)
{
p = p->pNext;
++i;
}
if(p == NULL || i < pos -1)
{
return false;
}
PNODE pNew;
pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("动态内存分配失败!");
exit(-1);
}
pNew->data = vale;
pNew->pNext = p->pNext;
p->pNext = pNew;
printf("\n");
return true;
}
bool delete_node(PNODE pHead, int pos, int vale)//删除节点, pos 表示删除节点的位置,vale表示删除的值
{
int i = 0;
PNODE p;
p = pHead;
while(p->pNext != NULL && i < pos-1)
{
p = p->pNext;
++i;
}
if(p->pNext == NULL || i < pos-1)
{
return false;
}
PNODE r;
r = p->pNext;
vale = r->data;
p->pNext = r->pNext;
free(r);
return true;
}
bool empty_node(PNODE pHead)//判断链表是否为空
{
if(pHead->pNext == NULL)
{
return true;
}
return false;
}
bool find_node(PNODE pHead, int pos, int vale)//按要求查找链表中的节点值
{
int i = 0;
PNODE p;
p = pHead;
while(p->pNext != NULL && i < pos-1)
{
p = p->pNext;
++i;
}
if(p->pNext == NULL || i < pos-1)
{
return false;
}
vale = p->pNext->data;
return true;
}
呵呵!楼主应该是名在校大学生哦!
上课一定没有认真听课哦!这可是数据结构链表中最简单的哦!呵呵!
答案如下(C++代码):
#include <iostreamh>
struct node
{
int data; //定义单链表的数据类型为INT型
node next; //next指针指向下一个数据元素
};
node head; //定义head为全局结构类型
void add() //由于篇幅问题没有设计捕错函数
{
int number;
head=new node;
node p,s; //p为总是指向最后元素的指针
p=head;
cout<<"输入数字('0'结束)";
while(number) //循环向表中输入数据直到‘0’结束
{
cin>>number;
if(number!=0)
{
s=new node;
s->data=number;
p->next=s;
s->next=NULL;
p=s;
}
else
{
number=0;
}
}
}
void list() //显示表中的元素(注意此表为带有头节点的链表)
{
node listtemp=head;
while(listtemp->next)
{
cout<<listtemp->next->data<<" ";
listtemp=listtemp->next;
}
}
void main()
{
add();
list();
delete head;
}
呵呵!以上仅供参考!不过楼主以后可要认真听课了哦!呵呵!毕竟知识还是自己的好!
以上就是关于如何用c语言输出整个单链表中的数据全部的内容,包括:如何用c语言输出整个单链表中的数据、C语言做数据结构单链表输出时,程序意外终止,请大家帮我看看,谢谢、数据结构C++ 的单链表 有关的完整的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)