1. 程式人生 > >資料結構一一線性表的鏈式儲存結構之插入與遍歷

資料結構一一線性表的鏈式儲存結構之插入與遍歷

#include <iostream>
#include <stdio.h>
#include <time.h>
#include <malloc.h>

#define ERROR	0
#define OK		1

typedef int Status;/* Status是函式的型別,其值是函式結果狀態程式碼,如OK等 */
typedef int ElemType;/* ElemType型別根據實際情況而定,這裡假設為int */

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node;
/* 定義LinkList */
typedef struct Node *LinkList;

/* 初始化順序線性表 */
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;
}

Status visit(ElemType c)
{
	printf("-> %d ",c);
	return OK;
}

/* 初始條件:順序線性表L已存在,1≤i≤ListLength(L), */
/* 操作結果:在L中第i個位置之前插入新的資料元素e,L的長度加1 */
Status ListInsert(LinkList *L,int i,ElemType e)
{
	int j;
	LinkList p,s;
	p = *L;     /* 宣告一個結點 p,指向頭結點 */
	j = 1;
	while (p && j < i)     /* 尋找第i個結點 */
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;   /* 第i個元素不存在 */
	s = (LinkList)malloc(sizeof(Node));  /*  生成新結點(C語言標準函式) */
	s->data = e;
	s->next = p->next;      /* 將p的後繼結點賦值給s的後繼  */
	p->next = s;          /* 將s賦值給p的後繼 */
	return OK;
}

int main()
{
	LinkList L;
	Status i;
	int j,k;
	char opp;

	i=InitList(&L);
	printf("連結串列L初始化完畢,ListLength(L)=%d\n",ListLength(L));

	printf("\n1.遍歷操作 \n2.插入操作  \n0.退出 \n請選擇你的操作:\n");
	while(opp != '0'){
		scanf("%c",&opp);
		switch(opp){
		case '1':
			ListTraverse(L);
			printf("\n");
			break;

		case '2':
			srand((unsigned)time(NULL));
			for(j=1;j<=10;j++)
			{
				i=ListInsert(&L,1,rand()%100);
			}
			printf("在L的表頭依次插入10個隨機數後:");
			ListTraverse(L);
			printf("\n");
			break;

		case '0':
			exit(0);
		}
	}
}