C--单链表操作
Posted yasina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C--单链表操作相关的知识,希望对你有一定的参考价值。
无头结点的单链表
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 5 //目的是学习单链表的操作 6 //创建,删除,遍历,插入,清空... 7 using namespace std; 8 #define INSERT 1//insert==0 尾插法,insert==1,头插法 9 10 typedef struct node{ 11 int data; 12 struct node *next; 13 }Node; 14 15 //统计链表中有几个和m相等的数 16 int count(Node* head,int m); 17 //释放链表所占的空间 18 void destory(Node* head); 19 //遍历并输出 20 void display_all(Node* head); 21 22 23 int main(){ 24 int n,x;//读n个数 25 26 #if INSERT==0//尾插法,特点是每次插入都在tail 27 //head链表指针,s临时结点 用来暂存接收的数据 ,tail尾结点 28 Node *head=NULL, *s, *tail; 29 cin>>n; 30 for(int i=0;i<n;i++){ 31 cin>>x; 32 //创建一个结点并开辟一片空间用来接收读入的值 33 s=(Node*)malloc(sizeof(Node)); 34 s->data = x; 35 36 if(i==0) head=s;//如果是第一次,则让head指向s, 37 else tail->next=s;//如果是第二个结点,则表明前面有一个tail,让s接在tail后面 38 //完成上面的步骤后 一定是s在tail结点后面,再把s变成tail结点 39 tail=s; 40 } 41 //数据接收完后,让tail结点指向null 42 tail->next=NULL; 43 44 #else//头插法 特点是每次都在head后面插入 45 Node *head=NULL,*s; 46 cin>>n; 47 for(int i=0;i<n;i++){ 48 cin>>x; 49 s = (Node*)malloc(sizeof(Node)); 50 s->data = x; 51 s->next = head; 52 head = s; 53 } 54 #endif 55 56 display_all(head); 57 58 int m; 59 cout<<"要查重的数字:"; 60 cin>>m; 61 cout<<count(head,m); 62 return 0; 63 } 64 65 void display_all(Node* head){ 66 Node* p=head; 67 while(p!=NULL){ 68 cout<<p->data<<" "; 69 p=p->next; 70 } 71 cout<<endl; 72 } 73 74 75 //遍历链表中有几个和m相等的数 76 int count(Node* head,int m){ 77 int c = 0; 78 Node *p=head; 79 while(p){ 80 if(p->data==m) 81 c++; 82 p=p->next; 83 } 84 return c; 85 } 86 87 88 //释放链表所占的空间 89 void destory(Node* head){ 90 Node *p = head,*q; 91 while(p){//p=null时退出 92 //q指向p,然后p再指向下一个结点 93 q=p; 94 p=p->next; 95 //释放q 96 free(q); 97 } 98 }
有头结点的单链表
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 5 using namespace std; 6 7 typedef struct node{ 8 int data; 9 struct node *next; 10 }Node; 11 12 void insert(Node *head,int x); 13 void display(Node* head); 14 void delete_node(Node* head,int k); 15 int find_x(Node* head,int x); 16 void insert_m_to_k(Node* head,int m,int k); 17 18 19 int main(){ 20 //创建一个带头结点的链表 21 Node *head; 22 head=(Node*)malloc(sizeof(Node)); 23 head->next=NULL; 24 25 //插入n个数据 26 int n,x; 27 cout<<"插入数据的长度:"; 28 cin>>n; 29 while(n--){ 30 insert(head,x); 31 } 32 display(head); 33 34 // cout<<"输入要删除第几个:"; 35 // cin>>n; 36 // delete_node(head,n); 37 // display(head); 38 39 // cout<<"输入要查找的数:"; 40 // cin>>n; 41 // cout<<"该数在第"<<find_x(head,n)<<"个"<<endl; 42 // display(head); 43 44 cout<<"把m插在第k个结点:"; 45 cin>>n>>x; 46 insert_m_to_k(head,n,x); 47 display(head); 48 49 return 0; 50 } 51 52 //这里实现的是头插法 53 void insert(Node *head,int x){ 54 //p指向第一个结点 55 Node *p=head->next; 56 //prep指向p的前一个结点 57 Node *prep=head; 58 //s开辟一片空间暂时接收数据x 59 Node *s=(Node*)malloc(sizeof(Node)); 60 cout<<"输入要插入的数据:"; 61 cin>>x; 62 s->data=x; 63 //s在第一个节点前面 64 s->next = p; 65 //头结点指向s 66 prep->next = s; 67 68 //第二次插入的时候p=head-》next指的就是这一次的s 69 //prep指的依然是头结点 70 //所以这里是头插法 71 } 72 73 //把m插入到第k个节点(头结点是第0个结点) 74 void insert_m_to_k(Node* head,int m,int k){ 75 Node* p=head,*q; 76 for(int i=1;i<k;i++){ 77 p=p->next; 78 } 79 q=p->next; 80 81 Node* s=(Node*)malloc(sizeof(Node)); 82 s->data=m; 83 84 s->next=q; 85 p->next=s; 86 } 87 88 89 //删除第k个节点,头结点是第0个结点 90 void delete_node(Node* head,int k){ 91 Node* p=head; 92 //这里移动到第k个节点的前一个结点 93 for(int i=1;i<k;i++){ 94 p=p->next; 95 } 96 Node* q=p->next;//q指向第k个 97 p->next=q->next;//让第k-1个指向第k+1个 98 free(q);//释放第k个结点 99 } 100 101 //查找x是第几个节点 102 int find_x(Node* head,int x){ 103 Node* p=head->next; 104 int cnt=1; 105 while(1){ 106 if(p->data==x){ 107 return cnt; 108 }else{ 109 p=p->next; 110 cnt++; 111 } 112 } 113 } 114 115 //遍历并显示 116 void display(Node* head){ 117 //head是头结点,所以head->next是第一个节点 118 //这一点与无头结点的链表不一样 119 //无头结点的链表head指的就是第一个结点 120 Node* p=head->next; 121 while(p!=NULL){ 122 cout<<p->data<<" "; 123 p=p->next; 124 } 125 cout<<endl; 126 }
以上是关于C--单链表操作的主要内容,如果未能解决你的问题,请参考以下文章