402v /posts/lian-biao-linklist-de-she-ji-yu-shi-xian-chu-shi-hua-chuang-jian-cha-ru-shan-chu-ni-zhi
链表(LinkList)的设计与实现(初始化,创建,插入,删除,逆置)
只是为了自己学习留作记录,需要的朋友可以看看。
修改日志:
version1.1:2011-3-26 1.在尾插法中增加p->next = NULL;2.将类似于p==NULL改为NULL==p(示范性改正,没有全改);
//////////////////////////////////////
//单链表的表示与实现 //
//Author:YuTianhang //
//Date:2011.3.23 //
<!--more-->
//Version:1.0 //
//////////////////////////////////////
#include "stdafx.h"
typedef int ElemType;
//定义单链表的结点类型
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
////////////////////////////////////////////////
//单链表的初始化
int InitList(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode)); //申请结点空间
if(NULL == L) printf("申请结点空间失败!\n"); //判断是否有足够的内存空间
L->next = NULL;
return 1;
}
///////////////////////////////////////////////
//头插法创建带头结点的单链表
int CreatList_H(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode)); //申请头结点空间
L->next = NULL; //初始化一个空链表
ElemType e;
printf("Input:!\n");
while(scanf("%d",&e) != EOF)
{
LNode *p;
p = (LNode *)malloc(sizeof(LNode)); //建立一个新结点
p->data = e;
p->next = L->next; //头插法插入结点p
L->next = p;
}
//int i = 5;
//while(i > 0)
//{
// scanf("%d",&e);
//
// LNode *p;
// p = (LNode *)malloc(sizeof(LNode)); //建立一个新结点
// p->data = e;
// p->next = L->next; //头插法插入结点p
// L->next = p;
// i--;
//}
return 1;
}
////////////////////////////////////////////////////////
//尾插法创建带头结点的链表
int CreatList_T(LinkList &L)
{
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
ElemType e;
LNode *r;
r = L;
while(scanf("%d",&e) != EOF)
{
LNode *p;
p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = NULL; //第一次没有付空值,导致输出的时候p的next指针无法确定
r->next = p; //尾插法插入结点p
r = p;
}
return 1;
}
///////////////////////////////////////////////////////
//在单链表的第i个位置插入元素e
int ListInsert(LinkList &L,int i,ElemType e)
{
LNode *pre; //pre为i位置的前驱结点
pre = L;
while(i > 0) //查找i位置的前驱结点
{
pre = pre->next;
--i;
}
LNode *p;
p = (LNode *)malloc(sizeof(LNode));
p->data = e;
p->next = pre->next; //将p结点插入到第i个位置
pre->next = p;
return 1;
}
/////////////////////////////////////////////////////////////
//在单链表中删除第i个结点并用e返回其结点值
int ListDelete(LinkList &L,int i,ElemType &e)
{
LNode *pre;
pre = L;
while(i > 0)
{
pre = pre->next;
--i;
}
LNode *p;
p = pre->next;
e = p->data;
pre->next = p->next; //删除第i个位置的结点p
free(p);
return 1;
}
/////////////////////////////////////////////////////
//输入单链表的各项
int OutputList(LinkList L)
{
if(L == NULL) printf("Error!\n");
LNode *p;
p = L->next;
printf("Kimimaro:\n");
do
{
if(p != L->next) printf(",");
printf("%d",p->data);
p = p->next;
}while(p != NULL);
printf("\n");
return 1;
}
//////////////////////////////////////////////////
//单链表的逆置
int InvertList(LinkList &L)
{
LNode *p,*q,*r;
p = L->next->next;
q = p->next;
r = L->next;
r->next = NULL;
while(p->next != NULL)
{
p->next = r; //头插法插入结点p
r = p;
p = q;
q = p->next;
}
p->next = r; //最后一个结点的处理
L->next = p;
//while(p != NULL) //错误代码,导致最后两个结点循环?
//{
// p->next = L->next; //头插法插入结点p
// L->next = p;
// p = q;
// q = p->next;
//}
//p->next = L->next; //最后一个结点的处理
//L->next = p;
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
LinkList L;
CreatList_H(L);
OutputList(L);
int i = 3;
ElemType e = 22;
ListInsert(L,i,e);
OutputList(L);
/*ListDelete(L,i,e);
OutputList(L);*/
InvertList(L);
OutputList(L);
char ch;
ch = getchar();
return 0;
}
评论 · 0
还没有评论。