数据结构(C语言)线性表的链式存储(复习完全资料)

2019-01-18 22:04

单链表

#include #include #define FLAG -1

typedef int elemtype;

typedef struct node //线性表的单链式存储结构 {

elemtype data;

struct node *next;

} LNode, *LinkList; /*结点类型名*/

//上面定义了LNode 是节点的类型,LinkList是指向LNode节点类型的指针类型。

//可定义一个LinkList类型的变量L,如LinkList L,作为单链表的头指针,来表示一个单链表。若L为“空”(L=NULL),则所表示的线性表为“空”表,其长度n为0。 若定义了如下指针

LNode *p;或LinkList p;

则语句P=(LNode*)malloc(sizeof(LNode))表示分配一个LNode型的结点的存储空间,并将其地址赋值给变量p,p所指结点为*p,*p的类型为LNode型,所以该结点的数据域为(*p).data或p->data,指针域为(*p).next或p->next,而语句free(p)则表示释放该结点所占用的存储空间。

//typedef LNode* LinkList;/*链表的类型*/ //LinkList 等价于 LNode * //LinkList H=NULL;

LinkList InitList() {

LinkList H;

H=(LinkList)malloc(sizeof(LNode)); H->data=9999; H->next=NULL; return H; }

//初始化带头结点链表 //初始化不带头结点的链表 LinkList InitLinkList() LinkList InitLinkList() { { LinkList H; LinkList H; H= (LinkList)malloc(sizeof(LNode)); H=NULL; H->next=NULL; return H; return H; } }

1

//不带头结点的单链表创建 LinkList CreateNoHeadList() {

LinkList L=NULL; LNode *s,*r=NULL; elemtype x;

scanf(\ while(x!=FLAG) {

s=(LNode *)malloc(sizeof(LNode)); s->data=x;

if(L==NULL) L=s; else r->next=s; r=s;

scanf(\ }

if(r!=NULL) r->next=NULL; return (L); }

//带头结点的头插法

LinkList CreateListFromHead1() {

elemtype x; LNode *s; LinkList H;

H=InitLinkList(); scanf(\ while(x!=FLAG) {

s=(LinkList )malloc(sizeof(LNode)); s->data=x;

s->next=H->next; H->next=s;

scanf(\ }

return H; }

//带头结点的单链表创建 LinkList CreateHeadList() {

LinkList L; LNode *s,*r; elemtype x;

L=(LinkList )malloc(sizeof(LNode)); L->next=NULL; r=L;

scanf(\ while(x!=FLAG) {

s=(LNode *)malloc(sizeof(LNode)); s->data=x;

// if(L==NULL) L=s; // else

r->next=s; r=s;

scanf(\ }

if(r!=NULL)r->next=NULL; return (L); }

//不带头结点的头插法

LinkList CreateListFromHead2() {

elemtype x; LNode *s;

LinkList H=NULL; scanf(\ while(x!=FLAG) {

s=(LinkList )malloc(sizeof(LNode)); s->data=x; s->next=H; H=s;

scanf(\ }

return H; }

2

//带头结点的尾插法

LinkList CreateListFromTail1() {

elemtype x; LNode *s,*r; LinkList H;

H=InitLinkList(); r=H;

scanf(\ while(x!=FLAG) {

s=(LinkList )malloc(sizeof(LNode)); s->data=x;

s->next=NULL; r->next=s; r=s;

scanf(\ }

return H; }

//带头结点的输出

void PrnLinkList(LinkList H) {

LNode *p=H->next;

while(p!=NULL) //while(p) {

printf(\ p=p->next;

}

printf(\}

//不带头结点的尾插法

LinkList CreateListFromTail2() {

elemtype x;

LNode *s,*r=NULL; LinkList H=NULL; scanf(\ while(x!=FLAG) {

s=(LinkList )malloc(sizeof(LNode)); s->data=x;

s->next=NULL; if(H==NULL) H=s; else r->next=s; r=s;

scanf(\ }

return H; }

//不带头结点的输出

void PrnLinkList(LinkList H) {

LinkList p=H; //LinkList p;p=H; while(p!=NULL) //while (p) {

printf(\ p=p->next; }

printf(\}

3

//带头结点的求表长算法 int LenList(LinkList L) {

LNode *p=L->next; int len=0;

while(p!=NULL) {

len++; p=p->next; }

return len; }

//带头结点的链表逆置 void reverse(LinkList H) {

LNode *p,*q; p=H->next;

H->next=NULL; while(p)

{ q=p;p=p->next; q->next=H->next; H->next=q; } }

//不带头结点的逆置

LinkList reverse2(LinkList H) {

LNode *p,*q; p=H;

H=NULL; while(p) {

q=p;p=p->next; q->next=H; H=q; }

return H; }

//不带头结点的求表长算法 int LenList(LinkList L) {

LNode *p=L; int len=0;

while(p!=NULL) {

len++; p=p->next; }

return len; }

//不带头结点的链表逆置 void reverse1(LinkList H) {

LNode *p,*q; p=H;

H=NULL; while(p) {

q=p;p=p->next; q->next=H; H=q; } }

//不带头结点的逆置,二重指针void reverse3(LinkList *H) {

LNode *p,*q; p=(*H);

(*H)=NULL; while(p) {

q=p;p=p->next; q->next=(*H); (*H)=q; } }

4

//查找第i个结点

LNode * GetItem(LinkList L,int i) {

LNode *p=L; int j=0;

while(p->next!=NULL&&j!=i) {

j++;

p=p->next; }

if(j==i) return p; else return NULL; }

//在第i个位置上插入值为x的结点 int InsItem(LinkList L,elemtype item,int i) {

LNode *pre,*s; int k;

//pre=GetItem(L,i-1); pre=L; k=0;

while(pre!=NULL&&k

/*在第i个元素之前插入,则先找到第i-1个数据元素的存储位置,使指针Pre指向它*/ {

pre=pre->next; k=k+1; }

if(k!=i-1)

/*即while循环是因为pre=NULL或i<1而跳出的,所以一定是插入位置不合理所致*/ {

printf(\插入位置不合理!\\n\ return 0; } else {

s=(LNode *)malloc(sizeof(LNode)); s->data=item;

s->next=pre->next; pre->next=s; return 1; } }

5

//删除第i个结点

int DelItem(LinkList L,int i) {

LNode *pre,*s; int k; /* pre=GetItem(L,i-1); if(pre==NULL)

{printf(\第i-1个结点不存在\ if(pre->next==NULL)

{printf(\第i个结点不存在\ */ pre=L; k=0; if(i==0)

{

printf(\删除结点的位置i不合理!\\n\ return -1; } while(pre->next!=NULL && knext; k=k+1; } /*查找第i-1个结点*/ if(!(pre->next)) /* 即while循环是因为p->next=NULL或i<1而跳出的,而是因为没有找到合法的前驱位置,说明删除位置i不合法。*/ { printf(\删除结点的位置i不合理!\ return 0; }

s=pre->next;

pre->next=s->next; free(s); return 1; }

int main() {

LinkList L;

// L=InitLinkList();

printf(\输入数值,以-1结束\\n\ L=CreateListFromTail1(); printf(\创建链表成功\\n\

PrnLinkList(L); return 0; }

6


数据结构(C语言)线性表的链式存储(复习完全资料).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:批评与自我批评发言稿

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: