数据结构编程实例

数据结构编程实例
数据结构编程实例

数据结构编程实例1.顺序表的基本操作

#define LEN 100

typedef struct sqlist{

int a[LEN];

int length;

};

void init(struct sqlist *sq) /*初始化*/ {int i;

for (i=0;i

sq->a[i]=0;

sq->length=0;

}

void creat(struct sqlist *sq) /*建顺序表*/ {int i;

printf("please input length");

scanf("%d",&sq->length);

printf("please input %d nums\n",sq->length); for (i=1; i<=sq->length;i++)

scanf("%d",&sq->a[i]);

}

void print(struct sqlist *sq) /*输出顺序表*/

{ int i;

for (i=1; i<=sq->length;i++)

printf(" %d",sq->a[i]);

printf("\n");

}

void insert(struct sqlist *sq,int pos, int x) /*顺序表插入元素*/ {int i;

for (i=sq->length;i>=pos;i--)

sq->a[i+1]=sq->a[i];

sq->a[pos]=x;

sq->length=sq->length+1;

}

int delete(struct sqlist *sq,int pos) /*顺序表删除元素*/

{int i,x;

x=sq->a[pos];

for (i=pos+1;i<=sq->length;i++)

sq->a[i-1]=sq->a[i];

sq->length=sq->length-1;

return(x);

}

main()

{int position,x;

struct sqlist *list;

struct sqlist slist;

int xz=0;

list =&slist;

while (1)

{ printf("1.init\n");

printf("2.creat\n");

printf("3.insert\n");

printf("4.delete\n");

printf("5.locate_value\n");

printf("6.locate_pos\n");

printf("7.print\n");

printf("0.exit\n");

printf("please input your choice");

scanf("%d",&xz);

switch(xz)

{case 1:init(list);break;

case 2:creat(list);break;

case 3:printf("pleast input inset position(pos) and value(x)");

scanf("%d%d",&position,&x);

if (position<1||position>list->length+1||list->length>=LEN)

printf("position error\n");

else insert(list,position,x);

break;

case 4:printf("pleast input delete position(pos)");

scanf("%d",&position);

if (position<1||position>list->length||list->length==0)

printf("position error\n");

else

printf("delete position=%d,delete data=%d\n",position,delete(list,position));

break;;

case 5:;

case 6:;

case 7:print(list);break;

case 0:exit(0);

} } }

2.三种方法建立链表

#include

typedef struct node

{int data;

struct node *link;}NODE;

NODE *creat1()

/*按输入数据的顺序建立链表,输入数据通过个数控制*/ {int i,data,n;

NODE *h=NULL,*p,*last=NULL;

printf("please input the num:");

scanf("%d",&n);

printf("please input %d datas:",n);

for (i=1;i<=n;i++)

{p=(NODE*) malloc (sizeof (NODE));

scanf("%d",&p->data);

if (i==1) h=p;

else last->link=p;

last=p;

}

last->link=NULL;

return(h);

}

NODE *creat2()

/*按输入数据的逆序建立链表,输入数据以0结束*/ {int data;

NODE *h=NULL,*p;

printf("please input datas(0 end)\n");

scanf("%d",&data);

while (data)

{p=(NODE*) malloc (sizeof (NODE));

p->data=data;

if (h==NULL) {h=p; h->link=NULL;}

else {p->link=h; h=p;}

scanf("%d",&data);

}

return(h);

}

NODE *creat3()

/*按输入数据的大小顺序建立带头结点的链表,输入数据以0结束*/ {int data;

NODE *h,*p,*q,*r;

h=(NODE*) malloc (sizeof (NODE)); h->link=NULL;

printf("please input datas(0 end)\n");

scanf("%d",&data);

while (data)

{p=(NODE*) malloc (sizeof (NODE));

p->data=data; p->link=NULL;

if (h->link==NULL) h->link=p;

else

{r=h; q=r->link;

while (p->data>q->data && q)

{r=q; q=q->link;}

if (q)

p->link=q;

r->link=p;

}

scanf("%d",&data);

}

return(h->link);

}

main()

{NODE *h,*p;

int x;

do

{printf("=====================\n"); printf("1.zhengxujianlianbiao\n");

printf("2.nixujianlianbiao\n");

printf("3.jianliyouxulianbiao\n");

printf("0.tuichu\n");

printf("=====================\n");

printf("please input your chosice");

scanf("%d",&x);

switch(x)

{case 1: h=creat1();break;

case 2: h=creat2();break;

case 3: h=creat3();break;

case 0: return;

}

p=h;

while (p)

{printf("%5d",p->data);

p=p->link;

}

printf("\n\n");

}

while (x);

}

3.试写出逆转线性单链表的算法

要逆转一个线性单链表,只需从头指针指向的结点开始扫描该链表,在扫描过程中改变各结点的指针(由指向后件改为指向原来的前件)即可。

Struct node /*ET位数据元素类型*/

{ET d;

struct node *next

};

invlst(head)

struct node **head ;

struct node *p, *q, *r ;

{if (*head==NULL) return;

p=*head; q=p->next;

p->next=NULL;

while (q!=NULL)

{r=q->next; q->next=p;

p=q; q=r;

}

*head=p;

return;

}

4.设有两个有序线性单链表,头指针分别为AH和BH。试写出将两个有序线性单链表合并为一个头指针为CH的有序线性单链表的算法,要求去掉重复元素。

Struct node /*ET位数据元素类型*/

{ET d;

struct node *next

};

#include “stdio.h”

mglst1(ah,bh,ch)

struct node ah,bh,**ch;

{struct node *i, *j, *k, *p;

et x;

i=ah; j=bh; *ch=NULL; k=NULL;

while ((i!=NULL)&&(j!=NULL))

{if (j->d>=i->d) {x=i->d; i=i->next;}

else {x=j->d; j=j->next;}

if (*ch==NULL)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; *ch=p; k=p;

}

else if (d!=k->d)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; k->next=p; k=p;}}}

if (j==NULL)

while (i!=NULtructL)

{x=i->d; i=i->next;

if (*ch==NULL)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; *ch=p; k=p;

}

else if (d!=k->d)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; k->next=p; k=p;

}}

else

while (j!=NULL)

{x=j->d; j=j->next;

if (*ch==NULL)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; *ch=p; k=p;

}

else if (d!=k->d)

{p=(struct node *) malloc (sizeof(struct node)); p->d=x; k->next=p; k=p;

}}

if (k!=NULL) k->next=NULL;

return;

}

5.试编写在二叉排序树中插入一个元素的算法。#include “stdlib.h”

struct btnode

{ET d;

struct btnode *lchild;

struct btnode *rchild;

};

struct btnode *insort(bt,b)

struct btnode *bt;

ET b;

{struct btnode *p, *q;

p=(struct btnode *)malloc (sizeof(struct btnode));

p->d=b; p->lchild=NULL; p->rchild=NULL;

q=bt;

if (q==NULL) bt=p;

else

{while ((q->lchild!=p) && (q->rchild!=p))

{if (bd)

{if (q->lchild!=NULL) q=q->lchild;

else q->lchild=p;

}

else

{if (q->rchild!=NULL) q=q->rchild;

else q->rchild=p;

}}}

return(bt);

}

6.先序(递归)建立二叉树并中序(递归)输出。#include

typedef struct bitree

{char data;

struct bitree *lchild,*rchild;

}BTREE;

BTREE *creatree()

{BTREE *t;

char ch;

scanf("%c",&ch);

if (ch==' ') t=NULL;

else

{t=(BTREE*) malloc (sizeof(BTREE));

t->data=ch;

t->lchild=creatree();

t->rchild=creatree();

}

return(t);

}

void inorder(BTREE *bt) { if(bt!=NULL) {inorder(bt->lchild); printf("%c ",bt->data); inorder(bt->rchild);

}

}

main()

{BTREE *root;

root=creatree(); inorder(root);

printf("\n");

}

相关主题
相关文档
最新文档