標籤:鏈表 sizeof 實現 new 刪除 while type splay address
#include<stdio.h>#include<stdlib.h>typedef struct Node { int data; struct Node *next;} node;/*初始化鏈表:1.首先給頭指標分配空間,將頭指標賦給temp2.其次給每一個元素分配空間3.將內容賦給當前節點的data,NULL賦給當前節點的next指標4.把當前節點賦給(頭指標)上一個節點的next指標5.上一節點指標後移,準備初始化下個元素6.最後返回當前鏈表的頭指標*/node *initnode() { int i; node *p = (node*)malloc(sizeof(node)); node *temp = p; for (i = 0; i < 10; i++) { node *a = (node*)malloc(sizeof(node)); a->data = i; a->next = NULL; temp->next = a; temp = temp->next; } return p;}/*指定位置插入元素:1.將頭指標賦給temp2.temp一直遍曆直到指定位置3.給需要插入的元素分配空間,並將內容賦給分配好空間的元素4.將插入位置的後一元素賦給要插入元素的next指標5.將插入元素賦給temp的next指標6.最後返回當前鏈表的頭指標*/node *insertElem(node *p, int elem, int pos) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *c = (node*)malloc(sizeof(node)); c->data = elem; c->next = temp->next; temp->next = c; return p;}/*刪除指定位置的元素:1.將頭指標賦給temp2.temp一直遍曆直到指定位置3.聲明一個變數代表待刪除節點4.將待刪除節點的下一節點賦給待刪除節點的上一節點的next指標5.釋放待刪除節點空間6.最後返回當前鏈表的頭指標*/node *delElem(node *p, int pos) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *c = temp->next; temp->next = c->next; free(c); return p;}/*查詢指定元素的位置:1.將頭指標賦給temp2.temp一直遍曆直到temp節點的值等於要查詢的元素3.返回當前節點的index4.如果鏈表遍曆結束也未找到指定節點,返回-1*/int selectElem(node *p, int elem) { node *temp = p; int i = 0; while (temp->next) { temp = temp->next; if (temp->data == elem) { return i; } i++; } return -1;}/*更新鏈表指定節點的值*/node *amendElem(node *p, int pos, int newElem) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *amend = temp->next; amend->data = newElem; return p;}/*遍曆鏈表*/void display(node *p) { node *temp = p; while (temp->next) { temp = temp->next; printf("%d ", temp->data); } printf("\n");}//以下內容來自《資料結構與演算法-C語言描述》int IsEmpty(node *p) { return p->next==NULL;}int IsLast(node *pos,node *p) { return pos->next==NULL;}//刪除指定位置的元素node *Delete(node *p,int elem) { node *temp=p; node *tmp; while(temp->next) { if(temp->next->data==elem) { tmp=temp->next; temp->next=tmp->next; free(tmp); } temp=temp->next; } return p;}//在指定位置插入元素node *Insert(node *p,int pos,int elem) { node *temp=p; int i; for(i=0; i<pos; i++) { temp=temp->next; } node *cell =(node*)malloc(sizeof(node)); cell->data=elem; cell->next=temp->next; temp->next=cell; return p;}//刪除listvoid DeleteList(node *p) { node *temp=p; node *tmp; p->next=NULL; while(temp->next) { tmp=temp->next; free(tmp); temp=temp->next; }}int main() { node *p = initnode(); display(p); printf("在第4的位置插入元素5:\n"); p = Insert(p, 4, 5); display(p); printf("刪除第3個元素:\n"); p = delElem(p, 3); display(p); printf("尋找元素2的位置為:\n"); int address = selectElem(p, 2); if (address == -1) { printf("沒有該元素\n"); } else { printf("元素2的位子為:%d\n", address); } printf("更改第3的位置的數為7:\n"); p = amendElem(p, 3, 7); display(p); printf("delete7\n"); p=Delete(p,7); display(p); printf("刪除\n"); DeleteList(p); display(p);}
C語言實現常用資料結構——鏈表