如何用c语言输出整个单链表中的数据

如何用c语言输出整个单链表中的数据,第1张

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++ 的单链表 有关的完整的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10634505.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-10
下一篇2023-05-10

发表评论

登录后才能评论

评论列表(0条)

    保存