C單鏈表操作
寫出來了不會用?看:
約瑟夫環(c循環鏈表)?
#include <stdio.h>
#include <stdlib.h>#define maxn 100????typedef int DataType;????//將數據類型定義為DataType,方便修改,這樣如果需要改成char只需要改這里就行了
typedef struct Node{DataType data;struct Node *next;
}Node;Node *CreatList(DataType a[],int n){Node *first = (Node*)malloc(sizeof(Node));first->next = NULL;Node *r = NULL,*p = NULL;r = first;for(int i = 0;i < n;i++){p = (Node*)malloc(sizeof(Node));p->data = a[i];p->next = NULL;r->next = p;r = p;}p->next = first->next; //鏈表末端指向鏈表頭 //此處是單鏈表和循環鏈表的差別return first;}//刪除第x位的元素
void DeleteData(Node *first,int x){Node *p = first->next;Node *r;int cnt = 1;????//cnt統計結點數while(p->next != first->next && cnt < x -1){ //判斷是否遍歷完成,當P為鏈表尾的時候,P->next應指向第一個元素,即first-next;p = p->next;}//敲黑板劃重點//比如說鏈表中有數據 1 2 3 4 5//要刪除位置為3 (此時對應數據也是3)//則令P指向第2個位置時停下來(修改指針域使P(此時P指向2)->next==P->next->next (p->next->next指向4)r = p->next;p->next = r->next;free(r); //釋放刪除位的空間,防止內存泄漏//如果要取得刪除的數據//則在函數聲明中添加參數DataType *ptr//并將要刪除的數據賦值給×ptr后再free
}//循環鏈表其他操作如果需要遍歷,則類似此函數,設置一個標記flag即可
//具體函數可參考C單鏈表操作
//http://blog.csdn.net/bestsort/article/details/78688374
void PrintList(Node *first){int flag = 0;//設置標記,當鏈表遍歷完成后停止Node *p = first->next;while(p != first ->next || !flag){printf("%d ",p->data);p = p->next;flag = 1;}
}int main()
{Node* first = NULL;int n;int i,k = 2,x = 1;DataType Data[maxn];scanf("%d",&n);for(i = 0;i < n;i++)scanf("%d",&Data[i]);first = CreatList(Data,n);PrintList(first);DeleteData(first,k);printf("\nAfter Delete:\n");PrintList(first);return 0;
}