資料結構基礎篇-------2. 單鏈表的建立及運算
阿新 • • 發佈:2018-12-17
/* * 單鏈表的建立及其運算 * 2018.10.23 * @L.F * * */ #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int DataType_t;//結點的資料型別為DataType_t,這裡是Int型 typedef struct Node //結點型別的定義 { DataType_t Data; //結點的資料域型別 struct Node *Next; //結點的指標域型別 }LinkList; LinkList *LinkListCreate() //建立一個空的連結串列 { LinkList *h = (LinkList *)malloc(sizeof(LinkList)); //建立一個頭結點 h->Next = NULL; //初始化結構體 return h; } void LinkListInsertHead(LinkList *h, DataType_t Value)//頭插法插入資料 { LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申請空間並賦值 Temp->Data = Value; Temp->Next = h->Next;//將頭結點的下一個結點的地址儲存在新插入結點的指標域裡面 h->Next = Temp;//將新插入的結點的地址儲存在頭結點的指標域裡面 return ; } void LinkListInsertTail(LinkList *h, DataType_t Value)//尾插法插入資料 { LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申請空間並賦值 Temp->Data = Value; while(h->Next != NULL)//找到最後一個結點 { h = h->Next; } Temp->Next = NULL; h->Next = Temp; return ; } void LinkListInsertPos(LinkList *h, int pos, DataType_t Value)//按照位置插入資料 { LinkList *Temp = (LinkList *)malloc(sizeof(LinkList)); Temp->Data = Value; int i =1; while(h->Next != NULL && i<= pos) { h = h->Next; i++; } if(h->Next == NULL) { printf("位置出錯\n"); } else { Temp->Next = h->Next; h->Next = Temp; } return ; } void LinkListInsertSort(LinkList *h, DataType_t Value)//按照順序插入(自帶排序功能) { LinkList *Temp = (LinkList *)malloc(sizeof(LinkList)); Temp->Data = Value; while(h->Next != NULL && h->Next->Data < Temp->Data) { h = h->Next; } Temp->Next = h->Next; h->Next = Temp; return ; } DataType_t LinkListDeleteHead(LinkList *h)//頭刪法刪除資料 { /*h->Next = h->Next->Next;//只刪除*/ /* * DataType_t Value; * Value = h->Next->Data; * h->Next = h->Next->Next; * */ /*釋放刪除結點*/ DataType_t Value; LinkList *Temp = h->Next; Value = h->Next->Data; h->Next = h->Next->Next; free(Temp); Temp = NULL; return Value; } int LinkListUpdata(LinkList *h, DataType_t OldValue, DataType_t NewValue)//按照資料修改資料 { while(h->Next != NULL) { if(h->Next->Data == OldValue) { h->Next->Data = NewValue; return 0; } h = h->Next; } printf("%d 是不存在的", NewValue); return -1; } int LinkListSearch(LinkList *h,DataType_t Value)//按照資料查詢位置 { int pos = 0; while(h->Next != NULL) { if(h->Next->Data == Value) { return pos; } h = h->Next; pos++; } printf("%d 不存在\n", Value); return -1; } void LinkListReverse(LinkList *h)//實現連結串列的翻轉 { LinkList *p = h->Next; LinkList *q; h->Next = NULL; while(p != NULL) { q = p; p = p->Next; q->Next = h->Next; h->Next = q; } return ; } void LinkListShow(LinkList *h)//列印資料 { while(h->Next != NULL) { h = h->Next; printf(" %d", h->Data); } putchar(10); } int main(int argc, const char *argv[]) { LinkList *h = LinkListCreate(); int F,s,i,a,n; while(1) { printf("請輸入您的需求: 1.頭插法插入資料 2.尾插法插入資料 3.按照位置插入資料\n"); printf(" 4.按照順序插入資料 5.頭刪法刪除資料 6.按照資料修改資料\n"); printf(" 7.按照資料查詢位置 8.實現連結串列的翻轉\n"); scanf("%d", &F); switch(F) { case 1: printf("請輸入您要插入的資料個數:"); scanf("%d",&s); for(i=0; i<s;i++) { printf("請輸入您要插入的資料:"); scanf("%d", &a); LinkListInsertHead(h,a); } LinkListShow(h); break; case 2: printf("請輸入您要插入的資料個數:"); scanf("%d",&s); for(i=0; i<s;i++) { printf("請輸入您要插入的資料:"); scanf("%d", &a); LinkListInsertTail(h,a); } LinkListShow(h); break; case 3: printf("請輸入您要插入資料的位置: "); scanf("%d", &n); printf("請輸入您要插入的資料: "); scanf("%d", &a); LinkListInsertPos(h, n, a); LinkListShow(h); break; case 4: printf("請輸入要插入的資料個數: "); scanf("%d",&s); for(i=0; i<s;i++) { printf("請輸入要插入的資料:"); scanf("%d", &a); LinkListInsertSort(h, a); } LinkListShow(h); break; case 5: LinkListDeleteHead(h); LinkListShow(h); break; case 6: printf("請輸入需要修改的資料:"); scanf("%d", &a); printf("請輸入修改為的資料: "); scanf("%d", &n); LinkListUpdata(h, a, n); LinkListShow(h); break; case 7: printf("請輸入您要查詢位置的資料: "); scanf("%d",&a); printf("所查資料的位置為%d \n", LinkListSearch(h,a)); break; case 8: LinkListShow(h); LinkListReverse(h); LinkListShow(h); break; default: break; } } return 0; }