C寫連結串列與線性表的建立插入與刪除
阿新 • • 發佈:2018-12-14
連結串列
#include <bits/stdc++.h> typedef struct node { int data; struct node *next; } Lnode; Lnode *L; void dele(int pos){ Lnode *p; p=L; for(int i=1; i<pos-1; i++){ p=p->next; } p->next=p->next->next; } void insert(int pos,int val){ Lnode *p; p=L; for(int i=1; i<pos-1; i++){ p=p->next; } Lnode *q; q=(Lnode *) malloc(sizeof(Lnode));; q->data=val; q->next=p->next; p->next=q; } int main() { L = (Lnode *) malloc(sizeof(Lnode)); L->data=1; L->next = NULL; Lnode *p, *temp; p = (Lnode *) malloc(sizeof(Lnode)); p = L; for (int i = 1; i <= 10; i++) { temp = (Lnode *) malloc(sizeof(Lnode)); temp->data = i+1; temp->next = NULL; p->next = temp; p = temp; } int len=10; while(1){ char ch; printf("若您要插入則輸入Y/y,若刪除則輸入N/n,若要輸出則輸入P/p,若要結束程式則輸入0\n"); scanf(" %c",&ch); if(ch=='0'){ break; } if(ch=='Y' || ch=='y'){ int pos,val; printf("請輸入插入的位置與數值: \n"); scanf("%d %d",&pos,&val); while(pos>len || pos<0){ printf("輸入不合法,請重新輸入合法的值\n"); scanf("%d %d",&pos,&val); } insert(pos,val); len++; } else if(ch=='N' || ch=='n'){ int pos; printf("請輸入刪除的位置: \n"); scanf("%d",&pos); while(pos>len || pos<0){ printf("輸入不合法,請重新輸入合法的值\n"); scanf("%d",&pos); } dele(pos); len--; } else if(ch=='P' || ch=='p'){ p=L; while (p->next != NULL) { printf("%d ", p->data); p=p->next; } printf("\n"); } } printf("最終連結串列儲存結果: "); while (L->next != NULL) { printf("%d ", L->data); L=L->next; } printf("\n"); return 0; }
線性表
#include <bits/stdc++.h> using namespace std; struct node { int *list; int length; int listsize; } L; void init(int q) { L.list = (int *) malloc(q * sizeof(int)); L.length = 0; L.listsize = q; } void insert(int val, int pos) { for (int i = L.length; i >= pos; i--) { L.list[i] = L.list[i - 1]; } L.list[pos - 1] = val; L.length++; } void dele(int pos) { for (int i = pos - 1; i < L.length - 1; i++) { L.list[i] = L.list[i + 1]; } L.length--; } void print(){ for(int i=0; i<L.length; i++){ if(i==0 || (i%9==1 && i!=1)){ printf("%d",L.list[i]); } else if(i==L.length-1 || i%9==0){ printf(" %d\n",L.list[i]); } else printf(" %d",L.list[i]); } } int main() { int maxn; printf("請輸入您想定義的線性表長度: \n"); scanf("%d", &maxn); init(maxn); for(int i=0; i<maxn/2; i++){ L.list[i]=i+1; L.length++; } while (1) { printf("若您要進行插入操作請鍵入(Y/y),若刪除則鍵入(N/n),若要檢視線性表儲存元素則鍵入(P/p),若要結束程式,請鍵入exit\n"); char str[10]; scanf("%s",str); if (strlen(str) == 1 && (str[0] == 'y' || str[0] == 'Y')) { if(L.length==maxn){ printf("此線性表已滿,不可進行插入操作\n"); continue; } printf("請鍵入您想插入的權值及位置\n"); int val, pos; printf("權值: "); scanf("%d", &val); printf("\n位置: "); scanf("%d", &pos); printf("\n"); while (pos > L.length) { printf("此位置超出現有線性表長度,請重新輸入插入位置: "); printf("提示:現有線性表長度為%d\n",L.length); scanf("%d", &pos); printf("\n"); } while(pos<0){ printf("此位置不合法,請重新輸入插入位置: "); scanf("%d",&pos); printf("\n"); } insert(val, pos); } else if (str[0] == 'n' || str[0] == 'N') { if(L.length==0){ printf("此線性表為空,不可進行刪除操作\n"); continue; } printf("請鍵入您要刪除的位置: "); int pos; scanf("%d", &pos); printf("\n"); while (pos > L.length) { printf("此位置超出現有線性表長度,請重新輸入刪除位置: "); printf("提示:現有線性表長度為%d\n",L.length); scanf("%d", &pos); printf("\n"); } while(pos<0){ printf("此位置不合法,請重新輸入插入位置: "); scanf("%d",&pos); printf("\n"); } dele(pos); } else if(str[0]=='p' || str[0]=='P'){ print(); } else if(strcmp(str,"exit")==0) break; else{ printf("請鍵入有效資訊!\n"); } } return 0; }