#include "nodedef.h"
#define CreateLinklistWay 1 // 0表示头插法创建链表,1表示尾插法创建链表
#if !CreateLinklistWay
/*********************************************************************
* 函数名称:linklist *CreateLinklistHead()
* 函数功能:利用头插法创建链表
* 参数:无
* 说明:无
*********************************************************************/
extern linklist *CreateLinklistHead()
{
int x, i, nodeNum
linklist *head, *temp // 头结点与临时结点
head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点
head->next = NULL // 给表头结点的指针域赋值
printf("请拿好输入链表中结点的个数:")
scanf("%d", &nodeNum)
for(i=1i<=nodeNumi++)
{
printf("请输入第 %d 个结点的数据:", i)
scanf("%d", &x)
temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点
temp->data = x // 对新结点的数据域赋值
// 将新结点插到头结点之后
temp->next = head->next
head->next = temp
}
return head // 返回新建链表的头结点
}
#else
/*********************************************************************
* 函数名称:linklist *CreateLinklistRear()
* 函数功能:利用尾插法创建链表
* 参数:无
* 返 回 值:创建完链表后的链表头结点
* 说明:无
*********************************************************************/
extern linklist *CreateLinklistRear()
{
int x, i, nodeNum
linklist *head, *rear, *temp // 定义头结点、尾结点和临时结点
head = (linklist *)malloc(sizeof(linklist)) // 生成表头结点,表头结点不存放数据
head->next = NULL // 将表头结点的指针域赋值为NULL
rear = head // 将表头结点赋值给表尾结点蚂敏樱
printf("请输入链表中结点的个数:")
scanf("%d", &nodeNum)
for(i=1i<=nodeNumi++)
{
printf("请输入第 %d 个结点的数据:", i)
scanf("%d", &x)
temp = (linklist *)malloc(sizeof(linklist)) // 生成新的结点
temp->data = x // 新增结点的数据域
temp->next = NULL// 新增结点的指针域(由于是尾插法,所以插入的结点都在尾部,即指针域为NULL)
rear->next = temp/闷丛/ 使前一个结点指向新增结点(head->next=temp)
rear = temp // 将新增结点赋值给尾结点(尾插法,插入的结点在尾部)(rear=head->next)
}
//rear->next = NULL // 将尾结点的指针域赋值为空(为了方便检验链表是否为空链表)
return head // 返回头结点
}
#endif
#include<stdio.h>#include<stdlib.h>
#define N 10 //顺序表的最大容量
int length=0 //顺序表的当前元素个数
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define LIST_INIT_SIZE 100//线性表存储的空间初和正戚始化分配量
#define LISTINCREAMENT 10 //线性表存储空间的分配增量
typedef struct LNode//线性单链表存储结构
{
int data
struct LNode *next
}LNode,*LinkList
int CreatList_L(LinkList&L)//创建一个线性链表
{
L=(LinkList)malloc(sizeof(LNode))//分配一个空间给链表,作为头结点
if(!L) exit(OVERFLOW)
L->next=NULL
return OK
}
int DestroyList_L(LinkList &L)//销毁链表
{
if(L) free(L)
return OK
}
int ListInsert_L(LinkList&L,int i,int e)//再练表的第i个元素前插入一个元素e
{
LinkList p=L//p指针定位于i-1
LNode *s
int j=0
while(p&&j<i-1) {p=p->nextj++}//定位
if(!p||j>i-1) return ERROR//如果i<1或大于链表元素个数+1
s=(LNode*)malloc(sizeof(LNode))
if(!s) exit(OVERFLOW)
s->data=e //完成唤陵插入 *** 作
s->next=p->next
p->next=s
return OK
}
int ListDelet_L(LinkList&L,int i,int&e)//删除链表L中的第i个元素,并返回给e
{
LinkList p=L
LNode* q
int j=0
while(!p&&j<i-1) {p=p->nextj++}//p指针定位于i-1;
if(!p->next||j>i-1) return ERROR
e=p->next->data //完成删除 *** 作
q=p->next
p->next=p->next->next
free(q)
return OK
}
int ListTraverse_L(LinkList L,int n)//链表的遍历
{
int i=0
if(!L)return ERROR
L=L->next
while(L)
{
if(L->data==n)return i
L=L->next
i++
}
return FALSE
}
int InverseSingleList_L(LinkList &L)
{
if(!L->next||!L->next->next)//如果链表少于2个Node那么链表不需要改变顺序
return OK
LNode *p,*q
p=L->next//第一次因为p是最后一个连接所以把p->next设为空
q=p->next
p->next=NULL
p=q
while(p)
{
q=p->next//用q去保留p后面一个Node
p->next=L->next
L->next=p
p=q
}
return OK
}
int main()
{
int List[N]
LinkList L
int ch,exit='N'
do
{
system("CLS")
printf("\t\t********************************************\n")
printf("\t\t* 1.创建一个顺序表.........(1)*\n")
printf("清厅\t\t* 2.在顺序表中查找元表.........(2)*\n")
printf("\t\t* 3.在顺序表中插入元表.........(3)*\n")
printf("\t\t* 4.在顺序表中删除元表.........(4)*\n")
printf("\t\t* 5.退出 .........(5)*\n")
printf("\t\t********************************************\n")
printf("\n请选择 *** 作代码:")
ch=getchar()
switch(ch)
{
case '1':
printf("\n请输入十个元素")
CreatList_L(L)
for(length=0length<Nlength++)
{
scanf("%d",&List[length])
getchar()
ListInsert_L(L,length+1,List[length])
}
printf("\n创建成功!")
getchar()
break
case '2':
scanf("%d",&List[0])
if(ListTraverse_L(L,List[0]))printf("该元素存在该年表的第%d个位置",ListTraverse_L(L,List[0]))
else printf("不存在该元素")
getchar()
break
case '3':
scanf("%d%d",&length,&List[0])
ListInsert_L(L,length,List[0])
system("pause")
break
case '4':
scanf("%d",&length)
ListDelet_L(L,length,List[0])
system("pause")
break
case '5':
printf("\n您是否真的要退出程序(Y/N):")
getchar()
exit=getchar()
break
default:
getchar()
printf("\n无效输入,请重新选择...:")
getchar()
break
}
}while(exit!='y'&&exit!='Y')
}
#include <stdio.h>#include <stdlib.h>
struct node
{
int num
struct node *next
}
/*建立链表*/
struct node *creat(int n)
{
int x, i
struct node *head, *p, *r
head=(struct node*)malloc(sizeof(struct node))
r=head
printf("请输入数字\r\n")
for(i=0i<ni++)
{
scanf("%d", &x)
p=(struct node*)malloc(sizeof(struct node))
p->num=x
r->next=p
r=p
}
r->next=NULL
return(head)
}
/*删除重复结点*/
void delet(struct node *head)
{
struct node *p, *q, *r
p=head->next
while(p!=NULL)
{
q=p
while(q->next!=NULL)
{
r=q->next
if(r->num==p->num)
{
if(r->next!=NULL)
{
q->next=r->next
free(r)
}
else
{
q->next=NULL
free(r)
}
}
else
{
q=r
}
}
p=p->next
}
}
/*排序*/
void sort(struct node *head)
{
struct node *p, *q, *small
int temp
for(p=head->nextp->next!=NULLp=p->next)
{
small=p
for(q=p->nextq!=NULL q=q->next)
{
if(q->num<small->num)
small=q
}
if(small!=p)
{
temp=small->num
small->num=p->num
p->尺码贺num=temp
}
}
}
/*输出*/
void output(struct node *head)
{
struct node *pt
pt=head->next
while(pt!=NULL)
{
printf("%d\r\n", pt->num)
pt=pt->next
}
}
void destroy(Node* head)
{
while (head)
{
Node* temp = head
head = head->pstnext
free(temp)
}
}
main()
{
int n
struct node *head
printf("输入数字的个数n\r\n")
scanf("%d", &n)
head=creat(n)
printf("输入的数字\r\n")
output(head)
delet(head)
printf("删除重复结点后输出数字\r\n")
output(head)
sort(head)
printf("排序后输出数字\r\模慧n")
output(head)
destroy(head);
}
给你一个我的程序,大家一起进步!!!祝你学习快乐!!陵派!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)