第四周项目3(1)-结点逆置

问题描述及代码:
[cpp] view plain copy
1.	/*    
2.	*烟台大学计控学院     
3.	*作    者:朱建豪   
4.	*完成日期:2016年9月22日 
5.	*问题描述:设计一个算法,将一个带头结点的数据域依次为a1,a2,…,an(n≥3)的单链表的所有结点逆置,即第一个结点的数据域变为an,…,最后一个结点的数据域为a1。实现这个算法,并完成测试。  
6.	* 
7.	*/  

(1)list.h的代码
[cpp] view plain copy
1.	#include<stdio.h>  
2.	#include<malloc.h>  
3.	typedef int ElemType;  
4.	typedef struct LNode        //定义单链表结点类型  
5.	{  
6.	    ElemType data;  
7.	    struct LNode *next;     //指向后继结点  
8.	}LinkList;  
9.	void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表  
10.	void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表  
11.	void InitList(LinkList *&L);  //初始化线性表  
12.	void DestroyList(LinkList *&L);  //销毁线性表  
13.	bool ListEmpty(LinkList *L);  //判断线性表是否为空  
14.	int ListLength(LinkList *L);  //求线性表长度  
15.	void DispList(LinkList *L);  //输出线性表  
16.	bool GetElem(LinkList *L,int i,ElemType &e);  //求线性表某个数据元素值  
17.	int LocateElem(LinkList *L,ElemType e);  //按元素值查找  
18.	bool ListInsert(LinkList *&L,int i,ElemType e);  //插入数据元素  
19.	bool ListDelete(LinkList *&L,int i,ElemType &e);  //删除数据元素  
20.	void Reverse(LinkList *&L);  

(2)list.cpp的代码
[cpp] view plain copy
1.	#include"list.h"  
2.	void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表  
3.	{  
4.	    LinkList *s;  
5.	    int i;  
6.	    L=(LinkList *)malloc(sizeof(LinkList));  
7.	    L->next=NULL;//创建头结点,其next域为NULL  
8.	    for(i=0;i<n;i++)  
9.	    {  
10.	        s=(LinkList *)malloc(sizeof(LinkList));  
11.	        s->data=a[i];//创建数据节点*s  
12.	        s->next=L->next;  
13.	        L->next=s;  
14.	    }  
15.	}  
16.	void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表  
17.	{  
18.	        LinkList *s,*r;  
19.	        int i;  
20.	        L=(LinkList *)malloc(sizeof(LinkList));  
21.	        r=L;  
22.	        for(i=0;i<n;i++)  
23.	        {  
24.	            s=(LinkList *)malloc(sizeof(LinkList));  
25.	            s->data=a[i];//创建数据节点*s  
26.	            r->next=s;//将*s插在*r之后  
27.	            r=s;  
28.	        }  
29.	        r->next=NULL;  
30.	}  
31.	  
32.	  
33.	  
34.	  
35.	void InitList(LinkList *&L) //初始化线性表  
36.	{  
37.	    L=(LinkList *)malloc(sizeof(LinkList));  
38.	    L->next=NULL;  
39.	}  
40.	void DestroyList(LinkList *&L)//销毁线性表  
41.	{  
42.	    LinkList *p=L,*q=p->next;  
43.	    while (q!=NULL)  
44.	    {  
45.	        free(p);  
46.	        p=q;  
47.	        q=p->next;  
48.	    }  
49.	    free(p);    //此时q为NULL,p指向尾结点,释放它  
50.	}  
51.	bool ListEmpty(LinkList *L)  //判断线性表是否为空  
52.	{  
53.	    return(L->next==NULL);  
54.	}  
55.	int ListLength(LinkList *L) //求线性表长度  
56.	{  
57.	    int n=0;  
58.	    LinkList *p=L;  
59.	    while(p->next!=NULL)  
60.	    {  
61.	        n++;  
62.	        p=p->next;  
63.	    }  
64.	    return (n);  
65.	}  
66.	  
67.	bool GetElem(LinkList *L,int i,ElemType &e)  //求线性表某个数据元素值  
68.	{  
69.	    int j=0;  
70.	    LinkList *p=L;  
71.	    while(j<i&&p!=NULL)  
72.	    {  
73.	        j++;  
74.	        p->next;  
75.	    }  
76.	    if(p==NULL)  
77.	        return false;  
78.	    else  
79.	    {  
80.	        e=p->data;  
81.	        return true;  
82.	    }  
83.	}  
84.	  
85.	int LocateElem(LinkList *L,ElemType e)  //按元素值查找  
86.	{  
87.	    int i=1;  
88.	    LinkList *p=L->next;  
89.	    while(p!=NULL&&p->data!=e)  
90.	    {  
91.	        p=p->next;  
92.	        i++;  
93.	    }  
94.	    if(p==NULL)  
95.	        return (0);  
96.	    else  
97.	        return(i);  
98.	}  
99.	  
100.	bool ListInsert(LinkList *&L,int i,ElemType e)  //插入数据元素  
101.	{  
102.	    int j=0;  
103.	    LinkList *p=L,*s;//p指向头结点,j置为0  
104.	    while(j<i-1&&p!=NULL)  
105.	    {  
106.	        j++;  
107.	        p=p->next;  
108.	    }  
109.	    if(p==NULL)  
110.	        return false;  
111.	    else  
112.	    {  
113.	        s=(LinkList *)malloc(sizeof(LinkList));  
114.	        s->data=e;  
115.	        s->next=p->next;  
116.	        p->next=s;  
117.	        return true;  
118.	    }  
119.	}  
120.	  
121.	bool ListDelete(LinkList *&L,int i,ElemType &e)  //删除数据元素  
122.	{  
123.	    int j=0;  
124.	    LinkList *p=L,*q;  
125.	    while(j<i-1&&p!=NULL)  
126.	    {  
127.	        j++;  
128.	        p=p->next;  
129.	    }  
130.	    if(p==NULL)  
131.	        return false;  
132.	    else  
133.	    {  
134.	        q=p->next;  
135.	        if(q==NULL)  
136.	            return false;  
137.	        e=q->data;  
138.	        p->next=q->next;  
139.	        free(q);  
140.	        return true;  
141.	    }  
142.	}  
143.	void DispList(LinkList *L)  //输出单链表  
144.	{  
145.	    LinkList *p=L->next;//p开始指向节点  
146.	    while(p!=NULL)  
147.	    {  
148.	        printf("%d ",p->data);  
149.	        p=p->next;  
150.	    }  
151.	    printf("\n");  
152.	}  
153.	void Reverse(LinkList *&L)  
154.	{  
155.	    LinkList *p=L->next,*q;  
156.	    L->next=NULL;  
157.	    while (p!=NULL)     //扫描所有的结点  
158.	    {  
159.	        q=p->next;      //让q指向*p结点的下一个结点  
160.	        p->next=L->next;    //总是将*p结点作为第一个数据结点  
161.	        L->next=p;  
162.	        p=q;            //让p指向下一个结点  
163.	    }  
164.	}  

(3)main.cpp的代码
[cpp] view plain copy
1.	#include"list.h"  
2.	int main()  
3.	{  
4.	    LinkList *L;  
5.	    ElemType a[]= {1,3,5,7, 2,4,8,10};  
6.	    CreateListR(L,a,8);  
7.	    printf("L:");  
8.	    DispList(L);  
9.	    Reverse(L);  
10.	    printf("逆置后L: ");  
11.	    DispList(L);  
12.	    DestroyList(L);  
13.	    return 0;  
14.	}  
运行结果:
<img src="https://img-blog.csdn.net/20160922111150409?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
知识点总结:
单链表的基本运算以及利用头插法赫尾插法建立链表
学习心得:
细节决定成败,一个小错误就可能导致大麻烦。。一定要细心。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值