数据结构小结
#include <stdio.h>#include <stdlib.h>
#include <time.h>
#define ERROR 0
#define TRUE 1
#define OK 1
#define FALSE 0
typedef int ElemType;
typedef int Status;
typedef struct Node
{
ElemType data; //Êý¾ÝÓò
struct Node* next; //Ö¸ÕëÓò
} Node ;
typedef struct Node* LinkList; /*定义LinkList*/
Status visit(ElemType c)
{
printf("%d", c);
return OK;
}
/*初始化顺序线性表*/
Status InitList(LinkList* L)
{
*L = (LinkList)malloc(sizeof(Node)); /*产生头结点,并使L指向此头结点*/
if (!(*L)) /*存储分配失败*/
{
return ERROR;
}
(*L)->next = NULL; /*指针域为空*/
return OK;
}
/*初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
int ListLength(LinkList L)
{
int i = 0;
LinkList p = L->next; /* p指向第一个结点*/
while (p)
{
i++;
p = p->next;
}
return i;
}
/*初始条件:顺序纯属表L已存在*/
/*操作结果:依次对L的每个数据元素输出*/
Status ListTraverse(LinkList L)
{
LinkList p = L->next;
while (p)
{
visit(p->data);
p = p->next;
}
printf("\n");
return OK;
}
/*随机产生n个元素的值,建立带头结点的单链表线性表L (尾插法)*/
void CreateListTail(LinkList* L, int n)
{
LinkList p, r;
int i;
srand(time(0)); /*初始化随机数种子*/
*L = (LinkList)malloc(sizeof(Node)); /*L为整个线性表*/
r = *L /*r为指向尾部结点*/
for(i=0; i<n; i++)
{
p = (Node*)malloc(sizeof(Node)); /*生成新结点*/
p->data = rand() % 100 + 1; /*随机生成100以内的数字*/
r->next = p; /*将表尾终端点的指针指向新结点*/
r = p; /*将当前的新结点定义为表尾终端结点*/
}
r->next = NULL; /*表示当前链表结点*/
//创建有环链表
//r->next=p;
}
Status GetMidNode(LinkList L, ElemType* e)
{
LinkList search, mid;
mid = search = L;
while (search->next != NULL)
{
//search移动的速度是 mid的2倍
if (search->next->next != NULL)
{
search = search->next->next;
mid = mid->next;
}
else
{
search = search->next;
}
}
*e = mid->data;
return OK;
}
/*
int CreateListHead(LinkList *L, int n)
{
LinkList p,r;
int i=1;
srand(time(0)); //初始化随机种子
(*L) = (LinkList)malloc(sizeof(struct Node)); //先建立一个带头结点的单链表
if((*L) == NULL)
{
fprintf(stderr, "malloc() error.\n");
return ERROR;
}
(*L)->next = NULL;
r=*L; //尾部结点
for(i=0; i<n; i++)
{
p=(Node *) malloc(sizeof(Node));
p->data=rand()%100+1;
r->next =p;
r=p;
}
r->next = NULL; //表示当前链表结束
return OK;
}
int ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return OK;
}
int printList(LinkList L)
{
LinkList p;
p = L->next;
if(p == NULL)
{
printf("链表为空.\n");
return ERROR;
}
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return OK;
}
*/
int main()
{
LinkList L;
Status i;
char opp;
ElemType e;
int find;
int tmp;
i = InitList(&L);
printf("初始化L后: ListLength(L)=%d\n", ListLength(L));
while (opp != '0')
{
scanf("%c", &opp);
switch (opp)
{
case '1':
ListTraverse(L);
printf("\n");
break;
case '2':
CreateListTail(&L, 20);
printf("整体创建L的元素(尾插法):\n");
ListTraverse(L);
printf("\n");
break;
case '3':
//clearList(pHead); //清空链表
printf("ListLength(L)=%d \n", ListLength(L));
printf("\n");
break;
case '4':
//GetNthNodeFromBack(L,find,&e);
GetMidNode(L, &e);
printf("链表中间结点的值为:%d\n", e);
//ListTraverse(L);
printf("\n");
break;
case '0':
exit(0);
}
}
/* printf("Hello world!\n");
CreateListHead(&L,100);
printList(L);
*/
return 0;
}
for(i=0; i<n; i++)
{
p = (Node*)malloc(sizeof(Node));/*生成新结点*/
p->data = rand() % 100 + 1; /*随机生成100以内的数字*/
r->next = p; /*将表尾终端点的指针指向新结点*/
r = p; /*将当前的新结点定义为表尾终端结点*/
}
for(i=0;i<n;i++) 也没有什么错误,怎么编译不通过?
我只是路过打酱油的。 少个分号 ; 路过打酱油的
页:
[1]