資料結構--C語言--逆序建立單鏈表,遍歷單鏈表,在單鏈表第5個元素前插入一個值為999的元素,刪除單鏈表第5個元素
阿新 • • 發佈:2018-11-29
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define LEN sizeof(struct LNode) struct LNode{ int data; struct LNode *next; }; typedef struct LNode LNode,* LinkList; //初始化 LinkList InitLNode(void){ LinkList head = (LinkList)malloc(LEN); if(!head){ printf("儲存空間分配失敗!\n"); exit(ERROR); } head->data = 0; head->next = NULL; return head; } //逆序建立單鏈表 int transCreat(LinkList head){ LinkList pnew; pnew = (LinkList)malloc(LEN); printf("請依次輸入資料(輸入-1認為輸入終止)\n"); scanf("%d",&pnew->data); while(pnew->data!=-1){//先把後邊的串上再串前邊的 head->data++; pnew->next = head->next;//核心語句 head->next = pnew; //核心語句 pnew = (LinkList)malloc(LEN); scanf("%d",&pnew->data); } free(pnew);//此時的pnew資料域裡存放著-1 沒有被鏈入到連結串列中 無用 return OK; } //輸出單鏈表 int printLNode(LinkList head){ if(!head->next){ printf("空連結串列!\n"); return ERROR; } LinkList p; p = head->next; do{ printf("%d ",p->data); p = p->next ; }while(p); } //插入 int insertLNode(LinkList head,int num,int locate){ if(locate<1||locate>head->data+1){ printf("插入位置有誤!\n"); exit(ERROR); } LinkList pnew,p; int i=0; p = head;//p指向第0個結點 i也表示第0個結點 pnew = (LinkList)malloc(LEN); pnew->data = num; while(p&&i<locate-1){//p的位置停在所要插入位置的前一位 p = p->next; i++;//p往後移動 i作為一個位置遊標就加1 } pnew->next = p->next; p->next = pnew; head->data++; return OK; } //刪除 int delLinkList(LinkList head,int locate){ if(!head->next){ printf("空連結串列!\n"); exit(ERROR); } if(locate<1||locate>head->data){ printf("位置有誤!\n"); return ERROR; } LinkList pleft,pright; int i = 0; pleft = pright = head; while(pright&&i<locate){ pleft = pright; pright = pright->next; i++;//pright和i指的是同一個結點 } pleft->next = pright->next; head->data--; free(pright); return OK; } main(){ LinkList head; head = InitLNode(); transCreat(head); printLNode(head); printf("\n\n在單鏈表第5個元素前插入一個值為999的元素後結果是:\n"); insertLNode(head,999,5); printLNode(head); printf("\n\n刪除單鏈表第5個元素後結果是:\n"); delLinkList(head,5); printLNode(head); }