#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int DataType; typedef struct node{/*結點類型定義*/ DataType data;/*結點的數據域*/ struct node *next;/*結點的指針域*/ }ListNode,*LinkList; ListNode *p; LinkList head; /*注意:定義結點結構時,有幾點須要注意:LinkList和ListNode *是不一樣名字的同一個指針類型,LinkList類型的指針變量head表示他是單鏈表的頭指針,ListNode *類型的指針變量p表示它是指向某一結點的指針*/ LinkList InitList() { LinkList L; L=(ListNode*)malloc(sizeof(ListNode)); if(L==NULL) { printf("分配空間失敗!"); exit(1); } L->next=NULL; return L; } LinkList CreatListF() {/*頭插法創建單鏈表*/ DataType x; LinkList L; ListNode *s; L=(ListNode *)malloc(sizeof(ListNode));/*頭結點*/ if(L==NULL)/*檢查L是否分配到儲存空間*/ { printf("分配空間失敗!"); exit(1); } L->next=NULL; scanf("%d",&x); while(x!=0) { s=(ListNode *)malloc(sizeof(ListNode));/*爲新插入的結點申請空間*/ if(s==NULL) { printf("分配空間失敗!"); exit(1); } s->data=x; s->next=L->next; L->next=s; scanf("%d",&x); } return L; } LinkList CreatListL() {/*尾插法創建單鏈表*/ DataType x; LinkList L=(ListNode *)malloc(sizeof(ListNode));/*頭結點*/ if(L==NULL) { printf("分配空間失敗!"); exit(1); } ListNode *s,*r; r=L; scanf("%d",&x); while(x!=0)/*以0輸入表示結束*/ { s=(ListNode *)malloc(sizeof(ListNode));/*爲新插入的結點申請空間*/ if(s==NULL) { printf("分配空間失敗!"); exit(1); } s->data=x; r->next=s; r=s; scanf("%d",&x); } r->next=NULL;/*單鏈表的最後一個指針爲空*/ return L; } int GetLength(LinkList L) { int num=0; ListNode *p; p=L->next; while(p!=NULL) { num++; p=p->next; } return(num); } ListNode *GetNode(LinkList L,int i) { int j=1; ListNode *p; if(i<1||i>GetLength(L)) { printf("查找的位置不正確!"); exit(1); } p=L->next; while(p!=NULL&&j<i) { p=p->next; j++; } return p; } int LocateListi(LinkList L,DataType x) { ListNode *p=L->next; int i=1; while(p!=NULL&&p->data!=x) { p=p->next; i++; } if(p==NULL) return 0; else return i; } void InsertList(LinkList L,DataType x,int i) { ListNode *p,*q,*s; int j=1; p=L; if(i<1||i>GetLength(L)+1) { printf("插入位置不正確!"); exit(1); } s=(ListNode *)malloc(sizeof(ListNode)); if(s==NULL) { printf("分配空間失敗!"); exit(1); } s->data=x; while(j<=i) { q=p; p=p->next; j++; } s->next=p; q->next=s; } void DeleteList(LinkList L,int i) { ListNode *p,*q; int j=1; p=L; if(i<1||i>GetLength(L)) { printf("刪除位置不正確!"); exit(1); } while(j<i) { p=p->next; j++; } q=p->next; p->next=q->next; free(q); } void PrintList(LinkList L) { ListNode *p; p=L->next; printf("鏈表元素以下:\n"); while(p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } int main() { DataType a; head=InitList(); printf("咱們將採用頭插法建立一個單鏈表L!\n請輸入您要輸入的數據(以空格隔開,以0結束!)\n"); head=CreatListL(); printf("單鏈表的長度爲:%d\n",GetLength(head)); printf("請輸入您要查找元素的結點序號:"); scanf("%d",&a); printf("第%d個元素爲:%d\n",a,GetNode(head,a)->data); printf("請輸入您要查找的元素:"); scanf("%d",&a); printf("您查找的元素%d在鏈表中的第%d個位置\n",a,LocateListi(head,a)); int x,i; printf("請輸入您要插入元素的數值以及位置:"); scanf("%d%d",&x,&i); InsertList(head,x,i); PrintList(head); printf("請輸入您想要刪除元素的位置:"); scanf("%d",&i); DeleteList(head,i); PrintList(head); return 0; }