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--单链表操作的主要内容,如果未能解决你的问题,请参考以下文章

数据结构代码(用C语言) 单链表的插入和删除

数据结构之单链表的增删查改等操作画图详解

C--单链表操作

C语言实现单链表(带头结点)的基本操作

C语言实现单链表基本操作

单链表