每天一個數據結構-----線性表的鏈式(單鏈表)儲存結構
阿新 • • 發佈:2018-12-20
// // main.c // LinkList // // Created by Jacobs.Guo on 2018/4/3. // Copyright © 2018年 yage guo. All rights reserved. // #include <stdio.h> #include <stdlib.h> #include <time.h> #define ERROR 0 #define OK 1 #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef int status; typedef struct Node { ElemType data; struct Node *next; } Node; typedef struct Node *LinkList; //單鏈表的整表建立(頭插法) //param:LinkList *L 沒有任何節點的單鏈表 //Param:int n 整數N,代表插入節點的個數 void CreateListHead(LinkList *L,int n) { LinkList q;int i; *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL;//構建頭結點 // srand((unsigned)time(NULL)); for (i = 0;i<n;i++) { q = (LinkList)malloc(sizeof(Node)); // q->data = rand() % 101; q->data = (i+1)*10; q->next = (*L)->next; (*L)->next = q; } } //單鏈表的整表建立(尾插法) void CreateListTail(LinkList *L,int n) { LinkList q,r;int i; *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; r = *L; for (i = 0;i<n;i++) { q = (LinkList)malloc(sizeof(Node)); q->data = (i+1)*10; r->next = q; r = q; } r->next = NULL; } //單鏈表的整表刪除 status ClearList(LinkList *L) { LinkList p,q; p = (*L)->next; while (p) { q = p->next; free(p); p = q; } return OK; } //刪除單鏈表的第I個節點 status ListDelete(LinkList *L,int position) { LinkList p,q;int i=1; p = (*L)->next; while (p->next && ((i++)<position-1)) { p = p->next; } if ((!p->next) || position > i) return ERROR; q = p->next; p->next = q->next; free(q); return OK; } //單鏈表的插入操作,在第position個位置上插入元素e status InsertList(LinkList *L,int position,ElemType e) { LinkList p,q;int i=1; p = *L; while (p->next && (i++)<position) { p = p->next; } if (i < position) return ERROR; q = (LinkList)malloc(sizeof(Node)); q->data = e; q->next = p->next; p->next = q; return OK; } status visit(ElemType c) { printf("%d ",c); return OK; } // 依次對L的每個資料元素輸出 status ListTraverse(LinkList L) { LinkList p=L->next; while(p) { visit(p->data); p=p->next; } printf("\n"); return OK; } int main() { LinkList L,La; printf("使用頭插法順序插入節點資料域為10、20、30、40、50之後的單鏈表L:\n"); CreateListHead(&L, 5); ListTraverse(L); printf("使用尾插法順序插入節點資料域為10、20、30、40、50之後的單鏈表L:\n"); CreateListTail(&La, 5); ListTraverse(L); if (ClearList(&La)) printf("La表已經清空\n"); printf("\n"); printf("刪除單鏈表L的第2個節點之後單鏈表的資料為:\n"); ListDelete(&L, 2); ListTraverse(L); printf("在單鏈表L的第2個位置新增資料域為100的節點之後:\n"); InsertList(&L, 2, 100); ListTraverse(L); ClearList(&L); return 0; }