單鏈表的建立,節點的插入,刪除,遍歷(未完善版)
阿新 • • 發佈:2018-12-18
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef int ElemType; typedef int Status; typedef struct LinkNode { ElemType data; struct LinkNode *next; }LinkNode,*LinkList; Status CreatLinkList(LinkList *L ) { LinkList r,p,ptr; (*L)=(LinkNode*)malloc(sizeof(LinkNode)); r=*L; ptr=*L; while(1) { p=(LinkNode*)malloc(sizeof(LinkNode)); scanf("%d",&p->data); // p->data=*Node_Value; r->next=p; r=p; if(r->data==0) { break; } } r->next=NULL; return OK; } Status DeleteLastNode(LinkList *L) { LinkList ptr,ptr1; ptr=*L; while(ptr->next!=NULL) { ptr1=ptr; ptr=ptr->next; } // printf("%d",ptr->data);while(1); ptr1->next=NULL; free(ptr); return OK; } Status LinkListInsert(LinkList *L,int &Insert_Pos,ElemType &Insert_Value) { LinkList k,s; k=*L; int j=1; // printf("%d",k->next->data); if(!k) { return ERROR; } while(k&&j<Insert_Pos) { k=k->next; j++; } s =(LinkList)malloc(sizeof(LinkNode)); s->data=Insert_Value; s->next=k->next; k->next=s; return OK; } Status LinkListDelete(LinkList *L,int num) { LinkList z,p; p=*L; int j=1; /*for(int i=0;i<num-1;i++) { z=z->next; }*/ while(j<num) { p=p->next; j++; } z=p->next; printf("%d",z->data);while (1); { } p->next=z->next; free(z); return OK; } Status GetNodeLength(LinkList *L) { LinkList p; int NodeNum=0; p=*L; while (p->next!=NULL) { p=p->next; NodeNum++; } return NodeNum; } void ShowLinkList(LinkList L) { printf("*************連結串列中的元素************\n"); LinkNode *node=L->next;// printf("%d ",L->next->data); while(node) { printf("%d ",node->data); node=node->next; } printf("\n"); } Status GetNodeLocation(LinkList *L, int e,int GetNodeLength) { LinkList p; p=*L; int j=1; while(j<GetNodeLength) { p=p->next; if(p->data==e) { break; } j++; } return j; } int main() { int LinkNode_num,Opt_num,Node_Value,Insert_Value,Insert_Pos; printf("1.初始化連結串列\n"); printf("2.插入節點\n"); printf("3.刪除節點\n"); printf("4.返回節點所在位置\n"); printf("5.遍歷連結串列\n"); printf("0.退出\n\n"); printf("請選擇你的操作:"); LinkList L; int k,j,i,m; int flag=0; while(1) { scanf("%d",&Opt_num); switch (Opt_num) { case 1: printf("請輸入節點的值,輸入0完成初始化\n"); //scanf("%d",&Node_Value); CreatLinkList(&L); DeleteLastNode(&L); k=GetNodeLength(&L); //printf("%d",k);while (1); //LinkListDelete(&L,k); ShowLinkList(L); break; case 2: printf("請選擇插入的位置:"); scanf("%d",&Insert_Pos); printf("輸入要插入節點的值:"); scanf("%d",&Insert_Value); LinkListInsert(&L,Insert_Pos,Insert_Value); ShowLinkList(L); break; case 3: printf("輸入刪除節點的位置:\n"); scanf("%d",&j); LinkListDelete(&L,j); printf("刪除%d節點後",j); ShowLinkList(L); break; case 4: printf("你要查詢第幾個節點的值所在位置:"); scanf("%d",&i); k=GetNodeLength(&L); m=GetNodeLocation(&L,i,k); printf("節點所在的位置:%d\n",m); break; case 5: ShowLinkList(L); break; case 0: flag++; break; default: break; } if (flag==1) { break; } } }