(参考书籍,《数据结构》,清华大学出版社
#include<stdio.h>
#include<stdlib.h>
//预定义常量
#define True 1 //真
#define False 0 //假
#define OK 1 //正常
#define ERROR 0 //错误
#define INFEASIBLE -1 //不可行
#define OVERFLOW -2 //上溢
typedef int Status; //Status表示状态,实际类型是int,相当于int的别名
typedef int ElemType;
typedef int Status;
#define MAX_SIZE 100
typedef struct sqlist
{
ElemType data;
struct sqlist *next; //指针域
ElemType Elem_array[MAX_SIZE];
int length; //定义线性表的长度
}Sqlist;
Sqlist *create_LinkList(void);
Sqlist *create_LinkList_weichafa(void);
ElemType Delete_Sqlist(Sqlist *L,int i);
Status Init_SqList( struct sqlist *L);
Status Inset_SqList(Sqlist*L,int i,ElemType e);
Status Locate_Delete_Sqlist(Sqlist *L,ElemType x);
void Isert_Sqlist(Sqlist *L,int i,ElemType e);
ElemType Get_Elm(Sqlist *L,int i);
void Delete_LinkList(Sqlist *L,int i);
void Delete_Sqlist_value(Sqlist *L);
//线性表的初始化
Status Init_SqList( struct sqlist *L)
{
L=(Sqlist *)malloc(sizeof(Sqlist)); //动态生成对象指针的时候,应该用对象,释放的时候应该用free(p)
//L->Elem_array=(ElemType *)malloc(MAX_SIZE*sizeof(ElemType));
if(!L->Elem_array)
return ERROR;
else
{
L->length=0;
return OK;
}
}
//线性表的插入,在固定位置插入,O(n)
Status Inset_SqList(Sqlist*L,int i,ElemType e)
{
int j;
if(i<0||i>L->length-1)
return ERROR;
if(L->length>=MAX_SIZE)
{
printf("线性表溢出!\n");
return ERROR;
}
for (j=L->length-1;j>=i-1;--j)
{
L->Elem_array[j+1]=L->Elem_array[j];
L->Elem_array[i-1]=e;
}
}
//顺序线性表的删除,时间复杂度为O(n)
ElemType Delete_Sqlist(Sqlist *L,int i)
{
int k;
ElemType x;
if(L->length==0)
{
printf("线性表L为空!\n");
return ERROR;
}
else if(i<1||i>L->length)
{
printf("要删除的数据不存在!\n");
return ERROR;
}
else
{
x=L->Elem_array[i-1];
for(k=i;k<L->Elem_array;k++)
{
L->Elem_array[k-1]=L->Elem_array[k];
}
L->length--;
return (x); //返回所删除的值
}
}
//时间列表查找定位删除,时间复杂度为
//先进行查找,然后从找到的位置之最后后一个结点依次向前移动一个位置
//时间复杂度为O(n)
Status Locate_Delete_Sqlist(Sqlist *L,ElemType x)
{
ElemType i=0,k;
while(i<=L->length)
{
if(L->Elem_array[i]!=x)
i++;
else
{
for(k=i;k<L->length;k++)
L->Elem_array[k]=L->Elem_array[k+1];
L->length--;
break;
}
}
if(i>L->length)
{
printf("线性表中没有所要求删除的数");
return ERROR;
}
return OK;
}
//线性表的链式存储,必须储存脸型表的结点和链
//建立单链表.时间复杂度都是O(n);
//头插法,输出的顺序与输入的顺序相反
Sqlist *create_LinkList(void)
{
int data;
Sqlist *head;
head = (Sqlist *)malloc(sizeof(Sqlist));
head->next=NULL;
while(1)
{
Sqlist *p;
printf("please input the number!!");
scanf("%d",&data);
if(data==0)
break;
else
{
p=(Sqlist *)malloc(sizeof(Sqlist));
p->data=data;
p->next=head->next;
head->next=p;
}
}
return (head);
}
//尾插法建立链表
Sqlist *create_LinkList_weichafa(void)
{
int data;
Sqlist *head,*temp;
head = (Sqlist *)malloc(sizeof(Sqlist));
head->next = NULL;
temp = (Sqlist *)malloc(sizeof(Sqlist));
temp = head;
while(1)
{
printf("please input the number!!!");
scanf("%d",&data);
if(data==0)
break;
else
{
Sqlist *p;
//temp = (Sqlist *)malloc(sizeof(Sqlist));
p = (Sqlist *)malloc(sizeof(Sqlist));
p->data=data;
temp ->next=p;
p->next=head->next;
temp = p;
}
}
temp->next=NULL;
return (head);
}
//单链表的查看,查看前n个数据
ElemType Get_Elm(Sqlist *L,int i)
{
int j;
Sqlist *p;
p = L->next;
j=1;
while(j<i)
{
if(p==NULL)
return (0);
else
{p=p->next;
j++;
if(j==i)
return (p->data);}
}
}
//单链表的插入,时间复杂度为O(n)
void Isert_Sqlist(Sqlist *L,int i,ElemType e)
{
int j=0;
Sqlist *temp,*p;
temp = L->next;
if(i==1)
{
p=(Sqlist *)malloc(sizeof(Sqlist));
p->data = e;
L->next = p;
p->next = temp;
}
else
{
while(p!=NULL&&(j++)<i-2)
temp = temp->next;
if(--j!=i-1)
printf("所输入的i值过大!!!");
else
{
p=(Sqlist *)malloc(sizeof(Sqlist));
p->data = e;
p->next = temp->next;
temp->next = p;
}
}
}
//单链表的删除,时间复杂度为O(n),按序号删除
void Delete_LinkList(Sqlist *L,int i)
{
int j=1;
Sqlist *temp,*p;
temp = L->next;
p = temp->next;
if(i==1)
{
L->next = p;
free(temp);
}
else
{
while(p->next!=NULL&&j<i-1) //查找结点
{
temp = p;
p = p->next;
j++;
}
if(j!=i-1)
printf("所要删除的数不再线性表中!!!");
else
{
temp->next = p->next; //删除结点
free(p);
}
}
}
//删除链表中所有值的重复的结点,使所用的结点不相同
void Delete_Sqlist_value(Sqlist *L)
{
Sqlist *p = L->next,*q,*ptr;
while(p!=NULL)
{
q = p;
ptr = p->next;
while(ptr!=NULL) //在尾部做特殊处理
{
if(ptr->data==p->data)
{
if(ptr->next ==NULL)
{
q->next = ptr->next;
free(ptr);
break;
}
else
{
q->next = ptr->next;
free(ptr);
q = q->next;
ptr = q->next;}
}
else
{
q = q->next;
ptr = ptr->next;
}
}
if(p->next==NULL)
break;
else
p = p->next;
}
}
//单链表的合并,把头指针为La,Lb的合并成Lc
int main()
{
Sqlist *L;
int i,e;
ElemType i2;
L = create_LinkList_weichafa();
Sqlist *dis;
dis = L->next;
while(dis!=NULL)
{
printf("%d",dis->data);
dis = dis->next;
}
printf("\n");
//printf("请输入所要删除的第几个");
//scanf("%d",&i);
Delete_Sqlist_value(L); //对函数的测试,这里可以改变函数体,在上面输入函数的参数,可以前后的输出,然后观察函数的功能
Sqlist *dis2;
dis2 = L->next;
while(dis2!=NULL)
{
printf("%d",dis2->data);
dis2 = dis2->next;
}
printf("\n");
printf("请输入所要查看的个数;");
scanf("%d",&i);
i2=Get_Elm(L,i);
printf("%d",i2);
return 0;
}
单向线性表的一些基本操作
最新推荐文章于 2021-05-20 02:36:07 发布