#include<stdio.h> #include<stdlib.h> #include<stdbool.h> typedef int DataType; typedef struct Node { ?? ?DataType data;?? ??? ??? ??? ?//?? ?数据域? ?? ?struct Node * next;?? ??? ??? ?//?? ?指针域? ?? ? }LinkList;
LinkList * Creat_List(int a[], int n);?? ?//?? ?创建链表? bool Empty_List(LinkList * L);?? ??? ??? ??? ?//?? ?判空? int Length_List(LinkList * L);?? ??? ??? ??? ?//?? ?链表长度? void Traverse_List(LinkList * L);?? ??? ??? ?//?? ?遍历? int Locate_List(LinkList * L, DataType x);?? ?//?? ?按值查找? bool Get_List(LinkList * L, int pos, DataType * x);?? ?//?? ?按位查找? bool Insert_List(LinkList * L, int pos, DataType x);//?? ?插入? bool Delete_List(LinkList * L, int pos, DataType *x);//?? ?删除? bool Destroy_List(LinkList * L); ?? ?//?? ?销毁链表?
int main() { ?? ?DataType x,val; ?? ?int a[5] = {12, 24, 33, 56, 78}; ?? ? ?? ?LinkList * L = Creat_List(a,5); ?? ?printf("链表元素:"); ?? ?Traverse_List(L); ?? ? ?? ?if(Insert_List(L, 2, 45)) ?? ?{? ?? ??? ?printf("\n插入成功!\n"); ?? ??? ?printf("插入元素:45"); ?? ??? ?printf("\n插入位置:第2个结点\n");? ?? ?}?? ?? ?? ?else ?? ??? ?printf("\n插入失败!\n"); ?? ?printf("链表元素:"); ?? ?Traverse_List(L); ?? ? ?? ?if(Delete_List(L, 2, &val)) ?? ?{ ?? ??? ?printf("\n删除成功!\n"); ?? ??? ?printf("删除元素:%d\n",val); ?? ??? ?printf("删除位置:第2个结点\n"); ?? ?} ?? ?else ?? ??? ?printf("\n删除失败!\n"); ?? ?printf("链表元素:"); ?? ?Traverse_List(L); ?? ? ?? ?printf("\n按值查找的元素:33"); ?? ?printf("\n按值查找元素的位置序号:%d\n\n",Locate_List(L,33)); ?? ? ?? ?if(Get_List(L, 4, &x)) ?? ?{ ?? ??? ?printf("按位查找成功!\n");?? ? ?? ??? ?printf("按位查找的元素:%d\n",x); ?? ??? ?printf("按位查找的位置:第4个结点\n"); ?? ?} ?? ?else?? ? ?? ??? ?printf("查找失败!\n"); ?? ? ?? ?printf("\n链表长度:%d\n",Length_List(L)); ?? ?printf("\n链表元素:"); ?? ?Traverse_List(L); ?? ? ?? ?return 0; } LinkList * Creat_List(int a[], int n) { ?? ?int i; ?? ?LinkList * L = (LinkList*)malloc(sizeof(LinkList));//?? ?创建一个头结点,返回头结点的地址? ?? ?if(!L) ?? ?{ ?? ??? ?printf("申请空间失败!\n"); ?? ??? ?exit(-1); ?? ?} ?? ?LinkList * Tail = L;?? ?//?? ?创建一个尾指针,指向头结点? ?? ?Tail->next = NULL; ?? ?for(i = 0; i<n; ++i) ?? ?{ ?? ??? ?printf("第%d个结点的值:",i+1); ?? ??? ?printf("%d",a[i]); ?? ??? ?LinkList * p = (LinkList*)malloc(sizeof(LinkList)); ?? ??? ?p->data = a[i]; ?? ??? ?Tail->next = p; ?? ??? ?p->next = NULL; ?? ??? ?Tail = p; ?? ??? ?printf("\n"); ?? ?} ?? ?printf("单链表创建成功!\n"); ?? ?return L; } bool Empty_List(LinkList * L) { ?? ?if(L->next==NULL)?? ?//?? ?头结点指针域为空,为空表? ?? ??? ?return true; ?? ?else ?? ??? ?return false; } int Length_List(LinkList * L) { ?? ?int cnt = 0; ?? ?LinkList * p = L->next; ?? ?while(p!=NULL) ?? ?{ ?? ??? ?cnt++; ?? ??? ?p = p->next; ?? ?} ?? ?return cnt; } void Traverse_List(LinkList * L) { ?? ?LinkList * p = L->next; ?? ?while(p!=NULL) ?? ?{ ?? ??? ?printf("%3d",p->data); ?? ??? ?p = p->next; ?? ?} ?? ?printf("\n"); ?? ?return; }
int Locate_List(LinkList * L, DataType x) { ?? ?int pos = 1; ?? ?LinkList * p = L->next; ?? ?while(p->data!=x&&p!=NULL) ?? ?{ ?? ??? ?pos++; ?? ??? ?p = p->next; ?? ?} ?? ?if(p!=NULL) ?? ??? ?return pos; ?? ?else ?? ??? ?return 0; }
bool Get_List(LinkList * L, int pos, DataType * x) { ?? ?int i = 1; ?? ?LinkList * p = L->next; ?? ?if(pos<1||pos>Length_List(L)) ?? ??? ?return false; ??? ?while(i<pos&&p!=NULL) ??? ?{ ??? ??? ?i++; ??? ??? ?p = p->next; ?? ?} ?? ?if(p!=NULL) ?? ?{ ?? ??? ?*x = p->data; ?? ??? ?return true;?? ? ?? ?} ?? ?else ?? ??? ?return false; }?
bool Insert_List(LinkList * L, int pos, DataType x) { ?? ?int i = 1; ?? ?LinkList * p = L->next; ?? ?if(pos<1||pos>Length_List(L)) ?? ??? ?return false; ?? ?while(i<pos-1&&p!=NULL) ?? ?{ ?? ??? ?i++; ?? ??? ?p = p->next; ?? ?} ?? ?if(p!=NULL) ?? ?{ ?? ??? ?LinkList * q = (LinkList *)malloc(sizeof(LinkList)); ?? ??? ?if(!q) ?? ??? ?{ ?? ??? ??? ?printf("申请空间失败!\n"); ?? ??? ??? ?exit(-1); ?? ??? ?} ?? ??? ?q->data = x; ?? ??? ?q->next = p->next; ?? ??? ?p->next = q; ?? ??? ?return true; ?? ?} ?? ?else ?? ??? ?return false; }
bool Delete_List(LinkList * L, int pos, DataType * x) { ?? ?int i = 1; ?? ?LinkList * p = L->next; ?? ?if(Empty_List(L)) ?? ??? ?return false; ?? ?if(pos<1||pos>Length_List(L)) ?? ??? ?return false; ?? ?while(i<pos-1&&p!=NULL) ?? ?{ ?? ??? ?i++; ?? ??? ?p = p->next; ?? ?} ?? ?if(p!=NULL) ?? ?{ ?? ??? ?LinkList * q = p->next; ?? ??? ?*x = q->data;? ?? ??? ?p->next = q->next; ?? ??? ?free(q); ?? ??? ?return true; ?? ?} ?? ?else ?? ??? ?return false; } bool Destroy_List(LinkList * L) { ?? ?LinkList * p = L; ?? ?if(Empty_List(L)) ?? ??? ?return false; ?? ?while(p!=NULL) ?? ?{ ?? ??? ?p = p->next; ?? ??? ?free(L); ?? ??? ?L = p; ?? ?} ?? ?L = p = NULL;?? ?// 防止产生野指针? ?? ?return true; }
|