資料結構一一線性表的鏈式儲存結構之插入與遍歷
阿新 • • 發佈:2019-02-14
#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); } } }