【数据结构】---链表

  1 #include<iostream>
  2 #include<string>
  3 #include<iomanip>
  4 #include<stdlib.h>
  5 using namespace std;
  6 
  7 typedef struct LNode {
  8     int data; //结点的数据域
  9     struct LNode *next; //结点的指针域
 10 }LNode, *LinkList; //LinkList为指向结构体LNode的指针类型
 11 
 12 bool InitList_L(LinkList &L)//构造一个空的单链表L
 13 {
 14     L=new LNode;     //生成新结点作为头结点,用头指针L指向头结点
 15     if(!L)
 16       return false;  //生成结点失败
 17     L->next=NULL;   //头结点的指针域置空
 18     return true;
 19 }
 20 
 21 void CreateList_H(LinkList &L)//前插法创建单链表
 22 {
 23     //输入n个元素的值,建立到头结点的单链表L
 24     int n;
 25     LinkList s; //定义一个指针变量
 26     L=new LNode;
 27     L->next=NULL; //先建立一个带头结点的空链表
 28     cout <<"请输入元素个数n:" <<endl;
 29     cin>>n;
 30     cout <<"请依次输入n个元素:" <<endl;
 31     cout <<"前插法创建单链表..." <<endl;
 32     while(n--)
 33     {
 34         s=new LNode; //生成新结点s
 35         cin>>s->data; //输入元素值赋给新结点的数据域
 36         s->next=L->next;
 37         L->next=s; //将新结点s插入到头结点之后
 38     }
 39 }
 40 
 41 void CreateList_R(LinkList &L)//尾插法创建单链表
 42 {
 43     //输入n个元素的值,建立带表头结点的单链表L
 44     int n;
 45     LinkList s, r;
 46     L=new LNode;
 47     L->next=NULL; //先建立一个带头结点的空链表
 48     r=L; //尾指针r指向头结点
 49     cout <<"请输入元素个数n:" <<endl;
 50     cin>>n;
 51     cout <<"请依次输入n个元素:" <<endl;
 52     cout <<"尾插法创建单链表..." <<endl;
 53     while(n--)
 54     {
 55         s=new LNode;//生成新结点
 56         cin>>s->data; //输入元素值赋给新结点的数据域
 57         s->next=NULL;//因为是尾插法,可能是最后一个节点,所以要置空
 58         r->next=s;//将新结点s插入尾结点*r之后
 59         r=s;//重新更新尾指针,r指向新的尾结点s
 60     }
 61 }
 62 
 63 bool GetElem_L(LinkList L, int i, int &e)//单链表的取值
 64 {
 65     //在带头结点的单链表L中查找第i个元素
 66     //用e记录L中第i个数据元素的值
 67     int j;
 68     LinkList p;
 69     p=L->next;//p指向第一个结点,
 70     j=1; //j为计数器
 71     while (j<i && p) //顺链域向后扫描,直到p指向第i个元素或p为空
 72     {
 73         p=p->next; //p指向下一个结点
 74         j++; //计数器j相应加1
 75     }
 76     if (!p || j>i)
 77         return false; //i值不合法i>n或i<=0
 78     e=p->data; //取第i个结点的数据域
 79     return true;
 80 }
 81 
 82 bool LocateElem_L(LinkList L, int e) //按值查找
 83 {
 84     //在带头结点的单链表L中查找值为e的元素
 85     LinkList p;
 86     p=L->next;
 87     while (p && p->data!=e)//顺链域向后扫描,直到p为空或p所指结点的数据域等于e
 88         p=p->next; //p指向下一个结点
 89     if(!p)
 90         return false; //查找失败p为NULL
 91     return true;
 92 }
 93 
 94 bool ListInsert_L(LinkList &L, int i, int e)//单链表的插入
 95 {
 96     //在带头结点的单链表L中第i个位置插入值为e的新结点
 97     int j;
 98     LinkList p, s;
 99     p=L;
100     j=0;
101     while (p&&j<i-1) //查找第i-1个结点,p指向该结点
102     {
103         p=p->next;
104         j++;
105     }
106     if (!p || j>i-1)//i>n+1或者i<1
107         return false;
108     s=new LNode;     //生成新结点
109     s->data=e;       //将新结点的数据域置为e
110     s->next=p->next; //将新结点的指针域指向结点ai
111     p->next=s;       //将结点p的指针域指向结点s
112     return true;
113 }
114 
115 bool ListDelete_L(LinkList &L, int i) //单链表的删除
116 {
117     //在带头结点的单链表L中,删除第i个位置
118     LinkList p, q;
119     int j;
120     p=L;
121     j=0;
122     while((p->next)&&(j<i-1)) //查找第i-1个结点,p指向该结点
123     {
124         p=p->next;
125         j++;
126     }
127     if (!(p->next)||(j>i-1))//当i>n或i<1时,删除位置不合理
128         return false;
129     q=p->next;        //临时保存被删结点的地址以备释放空间
130     p->next=q->next; //改变删除结点前驱结点的指针域
131     delete q;        //释放被删除结点的空间
132     return true;
133 }
134 
135 void Listprint_L(LinkList L) //单链表的输出
136 {
137     LinkList p;
138     p=L->next;
139     while (p)
140     {
141         cout<<p->data<<"	";
142         p=p->next;
143     }
144     cout<<endl;
145 }
146 
147 int main()
148 {
149     int i,x,e,choose;
150     LinkList L;
151     cout << "1. 初始化
";
152     cout << "2. 创建单链表(前插法)
";
153     cout << "3. 创建单链表(尾插法)
";
154     cout << "4. 取值
";
155     cout << "5. 查找
";
156     cout << "6. 插入
";
157     cout << "7. 删除
";
158     cout << "8. 输出
";
159     cout << "0. 退出
";
160     choose=-1;
161     while (choose!=0)
162     {
163         cout<<"请输入数字选择:";
164         cin>>choose;
165         switch (choose)
166         {
167         case 1: //初始化一个空的单链表
168             if (InitList_L(L))
169                 cout << "初始化一个空的单链表!
";
170             break;
171         case 2: //创建单链表(前插法)
172             CreateList_H(L);
173             cout << "前插法创建单链表输出结果:
";
174             Listprint_L(L);
175             break;
176         case 3: //创建单链表(尾插法)
177             CreateList_R(L);
178             cout << "尾插法创建单链表输出结果:
";
179             Listprint_L(L);
180             break;
181         case 4: //单链表的按序号取值
182             cout << "请输入一个位置i用来取值:";
183             cin >> i;
184             if (GetElem_L(L,i,e))
185             {
186                 cout << "查找成功
";
187                 cout << "" << i << "个元素是:"<<e<< endl;
188             }
189             else
190                 cout << "查找失败

";
191             break;
192         case 5: //单链表的按值查找
193             cout<<"请输入所要查找元素x:";
194             cin>>x;
195             if (LocateElem_L(L,x))
196                 cout << "查找成功
";
197             else
198                 cout << "查找失败! " <<endl;
199             break;
200         case 6: //单链表的插入
201             cout << "请输入插入的位置和元素(用空格隔开):";
202             cin >> i;
203             cin >> x;
204             if (ListInsert_L(L, i, x))
205                 cout << "插入成功.

";
206             else
207                 cout << "插入失败!

";
208             break;
209         case 7: //单链表的删除
210             cout<<"请输入所要删除的元素位置i:";
211             cin>>i;
212             if (ListDelete_L(L, i))
213                 cout<<"删除成功!
";
214             else
215                 cout<<"删除失败!
";
216             break;
217         case 8: //单链表的输出
218             cout << "当前单链表的数据元素分别为:
";
219             Listprint_L(L);
220             cout << endl;
221             break;
222         }
223     }
224     return 0;
225 }
//合并链表
#include<iostream>
#include<string>
using namespace std;

typedef struct LNode {
	int data; //结点的数据域
	struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

void CreateList_R(LinkList &L)//尾插法创建单链表
{
	//输入n个元素的值,建立带表头结点的单链表L
	int n;
	LinkList s, r;
	L=new LNode;
	L->next=NULL; //先建立一个带头结点的空链表
	r=L; //尾指针r指向头结点
	cout <<"请输入元素个数n:" <<endl;
	cin>>n;
	cout <<"请依次输入n个整型数(非递减):" <<endl;
	cout <<"尾插法创建单链表..." <<endl;
	while(n--)
    {
		s=new LNode;//生成新结点
		cin>>s->data; //输入元素值赋给新结点的数据域
		s->next=NULL;
		r->next=s;//将新结点s插入尾结点r之后
		r=s;//r指向新的尾结点s
	}
}

void mergelinklist(LinkList La, LinkList Lb, LinkList &Lc)
{
    LinkList p,q,r;
    p=La->next; //p指向La的第一个元素
    q=Lb->next; //q指向Lb的第一个元素
    Lc=La;      //Lc指向La的头结点;LC为新生成的链表头结点指针
    r=Lc;       //r指向Lc的尾部
    while(p&&q)//pq都为真的时候才可以比较
    {
        if(p->data<=q->data)//把p指向的结点串起来
        {
            r->next=p;
            r=p;
            p=p->next;//p后移一个结点 
        }
        else             //把q指向的结点串起来
        {
            r->next=q;
            r=q;
            q=q->next;
        }
    }
    r->next=p?p:q;//相当于if(p) r->next=p; else r->next=q;  
    delete Lb;
}
void Listprint_L(LinkList L) //单链表的输出
{
    LinkList p;
    p=L->next;
    while (p)
    {
        cout<<p->data<<"	";
		p=p->next;
    }
    cout<<endl;
}

int main()
{
	LinkList La,Lb,Lc;
	cout << "创建有序(非递减)单链表La:"<<endl;
	CreateList_R(La);
	cout << "创建有序(非递减)单链表Lb:"<<endl;
	CreateList_R(Lb);
	cout << "将两个有序(非递减)单链表La和Lb合并为Lc:"<<endl;
	mergelinklist(La,Lb,Lc);
	cout << "合并后的结果Lc:"<<endl;
	Listprint_L(Lc);
	return 0;
}
//快慢指针找中间数

#include<iostream>
#include<string>
using namespace std;

typedef struct LNode {
	int data; //结点的数据域
	struct LNode *next; //结点的指针域
}LNode, *LinkList; //LinkList为指向结构体LNode的指针类型

void CreateList_R(LinkList &L)//尾插法创建单链表
{
	//输入n个元素的值,建立带表头结点的单链表L
	int n;
	LinkList s, r;
	L=new LNode;
	L->next=NULL; //先建立一个带头结点的空链表
	r=L; //尾指针r指向头结点
	cout <<"请输入元素个数n:" <<endl;
	cin>>n;
	cout <<"尾插法(正序)创建单链表..." <<endl;
	while(n--)
    {
		s=new LNode;//生成新结点
		cin>>s->data; //输入元素值赋给新结点的数据域
		s->next=NULL;
		r->next=s;//将新结点s插入尾结点r之后
		r=s;//r指向新的尾结点s
	}
}

LinkList findmiddle(LinkList L)
{
	LinkList p,q;
    p=L; //p为快指针,初始时指向L
    q=L; //q为慢指针,初始时指向L
    while(p!=NULL&&p->next!=NULL)
    {
        p=p->next->next;//p为快指针一次走两步;
        q=q->next; //q为慢指针一次走一步
    }
    return q;//返回中间结点指针
}

void Listprint_L(LinkList L) //单链表的输出
{
    LinkList p;
    p=L->next;
    while (p)
    {
        cout<<p->data<<"	";
		p=p->next;
    }
    cout<<endl;
}

int main()
{
	LinkList L,mid;
	cout<<"创建单链表L:"<<endl;
	CreateList_R(L);
	cout<<"单链表数据为:"<<endl;
	Listprint_L(L);
	mid=findmiddle(L);
	cout<<"单链表中间结点数据为:"<<mid->data<<endl;
	return 0;
}

  

  

原文地址:https://www.cnblogs.com/alec7015/p/12511342.html