<pre name="code" class="plain">#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <io.h>
#include <math.h>
#include <time.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node,*LinkedList;
Status init(LinkedList *head){
*head = malloc(sizeof(Node));
if(*head == NULL) return ERROR;
(*head)->next = NULL;
return OK;
}
Status insert(LinkedList head,int i,ElemType e){
int k = 0;
LinkedList p,n;
p = head;
while(p != NULL && k<i-1){
p = p->next;
k++;
}
n = (LinkedList)malloc(sizeof(Node));
if(p == NULL||n == NULL) return ERROR;
n->data = e;
n->next = p->next;
p->next = n;
return OK;
}
Status delete(LinkedList head,int i){
int k = 0;
LinkedList p,n;
p = head;
while(p != NULL && k<i-1){
p = p->next;
k++;
}
if(p == NULL) return ERROR;
n = p->next;
p->next = n->next;
free(n);
return OK;
}
Status delete2(LinkedList head,ElemType e){
LinkedList p,n,nn;
p = head;
while(p->next != NULL){
n = p->next;
if(n->data == e){
nn = n->next;
p->next = nn;
n = NULL;
free(n);
break;
}
else
p = n;
}
return OK;
}
int getLength(LinkedList head){
int length = 0;
LinkedList p = head->next;
while(p != NULL){
p = p->next;
length++;
}
return length;
}
Status getDataByIndex(LinkedList head,int i,ElemType *e){
int k = 0;
LinkedList p;
p = head;
while(p != NULL && k<i){
p = p->next;
k++;
}
if(p == NULL) return ERROR;
*e = p->data;
return OK;
}
Status print(LinkedList head){
LinkedList p = head->next;
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
printf("\n");
return OK;
}
Status reverse(LinkedList head){
/*
* head-1-2-null
*
*/
//少于2个元素时直接返回
//if(head == NULL || head->next == NULL || head->next->next == NULL) return OK;
if(head->next == NULL || head->next->next == NULL) return OK;
LinkedList p,p1,p2;
p = head->next;
p1 = p->next;
p->next = NULL;
while(p1->next != NULL){
p2 = p1->next;
p1->next = p;
p = p1;
p1 = p2;
}
p1->next = p;
head->next = p1;
return OK;
}
Status reverse2(LinkedList head){
LinkedList current,next;
current = head->next;
if(head == NULL ||current == NULL) return OK;
while(current->next != NULL){
next = current->next;
current->next = next->next;
next->next = head->next;
head->next = next;
}
return OK;
}
int main(){
LinkedList head;
ElemType e;
Status k;
int i;
//初始化链表
printf("*****************初始化************************\n");
k=init(&head);
printf("初始化后,链表的长度为:%d\n",getLength(head));
//插入结点
printf("*****************插入10条数据************************\n");
for (i=0;i<10;i++)
k=insert(head,1,i);
print(head);
//删除结点(按id索引)
printf("*****************删除第2条数据************************\n");
k=delete(head,2);
print(head);
//查找结点
printf("*****************获取第1个结点数据*********************\n");
i=getDataByIndex(head,1,&e);
printf("%d\n",e);
//删除结点(按key值)
printf("*****************删除数据e************************\n");
k=delete2(head,1);
print(head);
//获取链表长度
printf("*****************获取链表当前长度**********************\n");
k=getLength(head);
printf("当前长度为%d\n",k);
//重新插入2条
printf("*****************清空并插入1条数据************************\n");
init(&head);
for (i=0;i<1;i++)
k=insert(head,1,i);
print(head);
printf("*****************反转************************\n");
reverse(head);
print(head);
printf("*****************再反转************************\n");
reverse2(head);
print(head);
return 0;
}
单链表的操作和2种反转方法
最新推荐文章于 2022-11-24 09:58:33 发布